И так, в связи с тем что пока мои телодвижения не принесли результатов - прилагаю образцы кода. В лазарусе структура, а точнее массив структур пишется следующим образом:
- Код: Выделить всё
var
i,len : integer;
Ptr,Start : Pointer;
Destlen : Longword;
procedure WriteInteger(int : integer);
begin
PLongInt(Ptr)^ := int;
Inc(ptr,sizeof(int));
end;
procedure WriteBool(bool : boolean);
begin;
PBoolean(Ptr)^ := bool;
inc(ptr,sizeof(boolean));
end;
begin
result := '';
if Count < 1 then
exit;
len := Count * TMDTMPointSize + SizeOf(Integer);
Start:= GetMem(len);
Ptr := Start;
WriteInteger(FLen);
for i := 0 to FLen-1 do
WriteInteger(FPoints[i].x);
for i := 0 to FLen-1 do
WriteInteger(FPoints[i].y);
for i := 0 to FLen-1 do
WriteInteger(FPoints[i].c);
for i := 0 to FLen-1 do
WriteInteger(FPoints[i].t);
for i := 0 to FLen-1 do
WriteInteger(FPoints[i].asz);
for i := 0 to FLen-1 do
WriteBool(FPoints[i].bp);
Destlen :=BufferLen;
if compress(BufferString,destlen,pchar(start),len) = Z_OK then
begin
setlength(result,Destlen + SizeOf(Integer));
PInteger(@result[1])^ := len;
Move(bufferstring[0],result[1 + sizeof(integer)],Destlen);
Result := 'm' + Base64EncodeStr(result);
end;
Freemem(start,len);
end;
Соответственно на выходе я получаю строку вида:
- Код: Выделить всё
mwQAAAHic42RgYOACYk4oDQLCQCwIxExAzAxlc0HFGZDUCkAxTN3CpSuBJCMBjLAHFyBkAiOyYgBXqALA
Затем уже из Delphi начинаю её разбирать:
- Код: Выделить всё
var
Source : String;
DestLen : longword;
i,ii,c,size : integer;
DPoints : TMDTMPointArray;
Ptr : pbytearray;
function ReadInteger : integer;
begin
Result := PInteger(ptr)^;
inc(ptr,sizeof(integer));
end;
function ReadBoolean : boolean;
begin
result := PBoolean(ptr)^;
inc(ptr,sizeof(boolean));
end;
begin
Result := false;
ii := Length(S);
if (ii = 0) then
exit;
if S[1] = 'm' then
begin
if ii < 9 then
raise Exception.CreateFMT('Invalid DTM-String passed to StringToDTM: %s',[s]);
Source := Base64DecodeStr(copy(s,2,ii-1));
Move(Source[1], i,4);
if i < 1 then
raise Exception.CreateFMT('Invalid DTM-String passed to StringToDTM: %s',[s]);
DestLen := BufferLen;
ptr := @Source[1 + sizeof(longint)];
//ZDecompress(Pointer(BufferString),DestLen,ptr,);
if uncompress(Pbyte(BufferString),DestLen,PByte(ptr),length(source)-sizeof(integer)) = Z_OK then
begin
ptr := pbytearray(BufferString);
Self.Count:= ReadInteger;
ii := Self.Count;
if (Self.Count * TMDTMPointSize) <> (Destlen - SizeOf(integer)) then
raise Exception.CreateFMT('Invalid DTM-String passed to StringToDTM: %s',[s]);
self.SetPointCount(ii);
DPoints := Self.FPoints;
for i := 0 to ii-1 do
DPoints[i].x := ReadInteger;
for i := 0 to ii-1 do
DPoints[i].y := ReadInteger;
for i := 0 to ii-1 do
DPoints[i].c := ReadInteger;
for i := 0 to ii-1 do
DPoints[i].t := ReadInteger;
for i := 0 to ii-1 do
DPoints[i].asz := ReadInteger;
for i := 0 to ii-1 do
DPoints[i].bp := ReadBoolean;
Result := true;
end;
end
Функция Base64DecodeStr - из модуля DCPCrypt64.pas; если я запаковываю строку из Delphi, то в Delphi же её спокойно распаковываю. Если я из Delphi пытаюсь распаковать строку, которая была обработана в Lazarus, то Base64DecodeStr - возвращает значение отличное от Lazarus, соответственно uncompress её не хавает. А если я делаю Base64DecodeStr(AnsiString(copy(s,2,ii-1))) - то на выходе я получаю тот же результат, что и в Lazarus, но uncompress всё так же отказывается распаковывать то что получается. Ну а моя задача собственно распаковать из Delphi, то что запаковано в Lazarus.