T
tranke
Unregistered / Unconfirmed
GUEST, unregistred user!
我在写一个解压缩字符串的算法,通过内存流压缩转换;比如原来的字符串长度是3500字节,压缩后是805字节,然后存放在动态数组array of char变量中,跟踪发现是二进制乱码内容;本地调用解压后是正确!
由于需要将这两个算法函数作为DLL接口,必须采用标准的DLL声明,所以需要将压缩后的数据内容array of char转换为PChar类型返回给第三方程序,现在问题是转换后PChar里面只有一个乱码值,只有1字节内容,有人说是array of char的地址,但我发现并不是,因为我另外写了一个测试程序,发现问题好像是有压缩后的乱码引起的,因为如果array of char存放的内容是正常的字符串,那么转换是成功的!
我从昨晚调试到现在都还没有成功,公司催着紧要!我将函数代码贴出来给大家看,请各位高手帮忙指点!谢谢
function GetXmlBuffer(xmlStr: PChar): PChar; stdcall;
var
nBytes, I: Integer;
tp:string;
begin
nBytes := Length(xmlStr);
GetMem(inputChar, nBytes + 1);
StrPLCopy(inputChar, xmlStr, nBytes);
inputChar[nBytes] := #0;
mStream := TMemoryStream.Create;
{将PChar转换为内存流}
mStream := PCharToMemoryStream(inputChar);
{压缩内存流}
compress(mStream);
{将压缩后的内存流写入字节流,准备Socket传输}
SetLength(vSendBuffer, mStream.Size);
mStream.Position := 0;
mStream.Read(vSendBuffer[0], mStream.Size); //mStream.Size值为805
//GetMem(Result, mStream.Size); //问题一样
Result := @vSendBuffer; //这里就可以发现Result并没有内容
end;
//外部调用
procedure TfrmZip.Button5Click(Sender: TObject);
var
pget: PChar;
begin
pget := GetXmlBuffer(PChar(Trim(Memo1.Lines.Text)));
ShowMessage(pget); //只有一个字节,是乱码
end;
补充一点,我用pointer来代替PChar也是一样的问题!
由于需要将这两个算法函数作为DLL接口,必须采用标准的DLL声明,所以需要将压缩后的数据内容array of char转换为PChar类型返回给第三方程序,现在问题是转换后PChar里面只有一个乱码值,只有1字节内容,有人说是array of char的地址,但我发现并不是,因为我另外写了一个测试程序,发现问题好像是有压缩后的乱码引起的,因为如果array of char存放的内容是正常的字符串,那么转换是成功的!
我从昨晚调试到现在都还没有成功,公司催着紧要!我将函数代码贴出来给大家看,请各位高手帮忙指点!谢谢
function GetXmlBuffer(xmlStr: PChar): PChar; stdcall;
var
nBytes, I: Integer;
tp:string;
begin
nBytes := Length(xmlStr);
GetMem(inputChar, nBytes + 1);
StrPLCopy(inputChar, xmlStr, nBytes);
inputChar[nBytes] := #0;
mStream := TMemoryStream.Create;
{将PChar转换为内存流}
mStream := PCharToMemoryStream(inputChar);
{压缩内存流}
compress(mStream);
{将压缩后的内存流写入字节流,准备Socket传输}
SetLength(vSendBuffer, mStream.Size);
mStream.Position := 0;
mStream.Read(vSendBuffer[0], mStream.Size); //mStream.Size值为805
//GetMem(Result, mStream.Size); //问题一样
Result := @vSendBuffer; //这里就可以发现Result并没有内容
end;
//外部调用
procedure TfrmZip.Button5Click(Sender: TObject);
var
pget: PChar;
begin
pget := GetXmlBuffer(PChar(Trim(Memo1.Lines.Text)));
ShowMessage(pget); //只有一个字节,是乱码
end;
补充一点,我用pointer来代替PChar也是一样的问题!