情况: 我挂了Send()&来自ws2_32的Recv(),现在我正在尝试使用下面的函数转换Buffer中包含的数据。但是,当我这样做时,我看到一些数据包正在显示1个半字节(例如“CA FE BA BE DE AD CO D”)而不是我们通常会看到的2个十六进制数字(例如“CA FE BA BE DE AD C0 DE” “)。
function ConvertDataToHex(Buffer: Pointer; Length: Word): string;
var
Iterator: Integer;
HexBuffer: string;
C: string;
Counter: Integer;
HexString: string;
begin
HexBuffer := '';
HexString := '';
for Iterator := 0 to Length - 1 do
begin
HexBuffer := HexBuffer +
IntToHex(Ord(char(Pointer(Integer(Buffer) + Iterator)^)), 2);
end;
for C in HexBuffer do
begin
Counter := Counter + 1;
if not Odd(Counter) then
begin
HexString := C + ' ';
end
else
begin
HexString := C;
end;
end;
Result := HexString;
end;
鉴于上面的解释,您是否在代码中看到一些可能导致某些结果字符串在字符串中具有奇数长度的异常?
答案 0 :(得分:4)
您的函数返回HexString
,它可以是单个字符,也可以是单个字符后跟字符串。它当然不会返回您期望它返回的内容,甚至声称它会返回。
这个功能应该是这样的:
function ConvertDataToHex(Buffer: Pointer; Len: Integer): string;
var
i: Integer;
P: PByte;
begin
Result := '';
P := Buffer;
for i := 0 to Len-1 do begin
Result := Result + IntToHex(P^, 2);
if i<Len-1 then begin
Result := Result + ' ';
end;
inc(P);
end;
end;
作为一个简单的演示,这段代码
var
foo: Int64 = $0123456789abcdef;
....
Writeln(ConvertDataToHex(@foo, SizeOf(foo)));
导致此输出:
EF CD AB 89 67 45 23 01