Record의 시리얼화 및 역시리얼화(delphi)
2073 단어 Delphi
TDefaultMessage = record //
Ident: Integer;
nIsZlib: Integer;
nLength: Integer;
end;
//
function RecordToString(var Buf; bufSize: Integer; isZlib: Boolean): string;
//
function StringToRecord(sData: string; var outBuf; outSize: Integer; isZlib: Boolean): Boolean;
//
function GetNetPacket(sData: string; var defMsg: TDefaultMessage; var msgBody, msgNone: string): Boolean;
function RecordToString(var Buf; bufSize: Integer; isZlib: Boolean): string;
var
str1: string;
begin
SetLength(str1, bufSize);
try
CopyMemory(PChar(str1), PChar(@Buf), bufSize);
if isZlib then
Result := ZCompressStr(str1)
else
Result := str1;
finally
SetLength(str1, 0);
end;
end;
function StringToRecord(sData: string; var outBuf; outSize: Integer; isZlib: Boolean): Boolean;
begin
if isZlib then
sData := ZDecompressStr(sData);
CopyMemory(PChar(@outBuf), PChar(sData), outSize);
Result := True;
end;
function GetNetPacket(sData: string; var defMsg: TDefaultMessage; var msgBody, msgNone: string): Boolean;
var
len: Integer;
begin
Result := False;
defMsg.Ident := -1;
msgBody := '';
msgNone := '';
if Length(sData) < SizeOf(TDefaultMessage) then
Exit;
if not StringToRecord(sData, defMsg, SizeOf(TDefaultMessage), False) then
Exit;
if defMsg.Ident < 0 then
Exit;
len := SizeOf(TDefaultMessage) + defMsg.nLength;
if Length(sData) < len then //
Exit;
if defMsg.nLength > 0 then begin
msgBody := Copy(sData, sizeof(TDefaultMessage) + 1, defMsg.nLength);
if defMsg.nIsZlib > 0 then
msgBody := ZDecompressStr(msgBody);
end;
//
if Length(sData) > len then
msgNone := Copy(sData, len + 1, Length(sData) - len);
Result := True;
end;
//demo:
procedure test1;
var
defmsg: TDefaultMessage;
sdata: string;
begin
sdata:= RecordToString(defmsg, sizeof(TDefaultMessage), false);
StringToRecord(sData, defmsg, sizeof(TdefaultMessage), false);
end;
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[Delphi] TStringBuilder그리고 꼭 사용해야만 할까? 그림처럼 Heap 영역에 "Hello" 공간을 생성하고 포인팅을 한다. "Hello World" 공간을 새로 생성한 후 포인팅을 하게 된다. 결국 "Hello" 라는 String 객체가 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.