1:压缩字符串并写入文件(其中用VCLUnZip解压字符串正常)
function TFMainForm.WriteZipRes(FileHandle: Integer; FileName: String): Integer;
var
Offset: Integer;
StrList: TStringList;
AnsiStr: String;
UnicodeStr: WideString;
CompStr: String;
Ms: TMemoryStream;
Size: Integer;
//DecompStr: String;
begin
Offset := 0;
StrList := TStringList.Create;
Ms := TMemoryStream.Create;
try
StrList.LoadFromFile(FileName); // trans to unicode
AnsiStr := StrList.Text;
UnicodeStr := WideString(AnsiStr); // compress
CompStr := VCLZip.ZLibCompressStr(UnicodeStr);
// decompress
//DecompStr := VCLUnZip.ZLibDecompressString(CompStr); // write to stream
Size := Length(CompStr);
Ms.Write(PChar(CompStr)^, Size); Offset := Offset + FileWrite(FileHandle, Ms.Memory^, Size);
finally
StrList.Free;
Ms.Free;
end; Result := Offset;
end;2:读文件中压缩的该区域,但是VCLUnZip.ZLibDecompressString报错
var
BinSize: Integer;
BinData: PChar;
try
BinSize := ResourceDataArr[i].Size;// 压缩后的长度
BinData := PChar(AllocMem(BinSize+1)); FileSeek(FFileHandle, ResourceDataArr[i].Offset, 0);// seek到位置
FileRead(FFileHandle, BinData^, BinSize);// 读取 DeCompStr := VCLUnZip.ZLibDecompressString(BinData);//出错 DeCompUnicodeStr := WideString(BinData);
ShowMessage(DeCompUnicodeStr);
finally
FreeMem(BinData);
end;这样的方法是用不压缩的字符串时可以正常的,压缩后就不正常,感觉是读取的字符串的后半部分没有了,但长度是对的,不知道是什么回事?
function TFMainForm.WriteZipRes(FileHandle: Integer; FileName: String): Integer;
var
Offset: Integer;
StrList: TStringList;
AnsiStr: String;
UnicodeStr: WideString;
CompStr: String;
Ms: TMemoryStream;
Size: Integer;
//DecompStr: String;
begin
Offset := 0;
StrList := TStringList.Create;
Ms := TMemoryStream.Create;
try
StrList.LoadFromFile(FileName); // trans to unicode
AnsiStr := StrList.Text;
UnicodeStr := WideString(AnsiStr); // compress
CompStr := VCLZip.ZLibCompressStr(UnicodeStr);
// decompress
//DecompStr := VCLUnZip.ZLibDecompressString(CompStr); // write to stream
Size := Length(CompStr);
Ms.Write(PChar(CompStr)^, Size); Offset := Offset + FileWrite(FileHandle, Ms.Memory^, Size);
finally
StrList.Free;
Ms.Free;
end; Result := Offset;
end;2:读文件中压缩的该区域,但是VCLUnZip.ZLibDecompressString报错
var
BinSize: Integer;
BinData: PChar;
try
BinSize := ResourceDataArr[i].Size;// 压缩后的长度
BinData := PChar(AllocMem(BinSize+1)); FileSeek(FFileHandle, ResourceDataArr[i].Offset, 0);// seek到位置
FileRead(FFileHandle, BinData^, BinSize);// 读取 DeCompStr := VCLUnZip.ZLibDecompressString(BinData);//出错 DeCompUnicodeStr := WideString(BinData);
ShowMessage(DeCompUnicodeStr);
finally
FreeMem(BinData);
end;这样的方法是用不压缩的字符串时可以正常的,压缩后就不正常,感觉是读取的字符串的后半部分没有了,但长度是对的,不知道是什么回事?
解决方案 »
- 数据库查询
- ■如何在显示窗体的时候(在最前面)而不使其他窗体失去焦点(变灰)?
- 如何在monthcalonder显示多个月
- JuckFapan来领分
- 本人想学DELPHIC,但不知道哪里可以下载DELPHIC?具体网址,在线等100分
- 请问那里有windows 95 的安装程序?我的分不多了,答对者每人十分吧!谢谢了!
- 如何进行BMP到JPG的相互转换
- 在程序运行过程中,为什么有些语句不被执行????
- 到www.wzb2b.com/install.gif去看看,帮帮?
- 如何在主程序启动的时候就打开子窗口,并使其“停靠”在主窗口的penal上
- 100分问一个关于在Olecontainer 里新建EXCEL文档的问题!!!!
- 关于delphi2007下操作Excel的问题
直接的PChar赋值给String,确实是将PChar指向的内容Copy给String了,但是String会将\0识别为结束符,因为是压缩的字符串,肯定会有这样的字符,所以必须使用Move方式,将PChar地址的内容手工复制到String的地址中,如下:
SetLength(CompStr, BinSize);
Move(BinData^, CompStr[1], BinSize);
这样就不会有任何字符的遗漏了。