Delphi - 从Buffer转换为Hex后的字符串中的奇数十六进制长度?

时间:2016-06-14 21:59:58

标签: delphi

情况: 我挂了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;

鉴于上面的解释,您是否在代码中看到一些可能导致某些结果字符串在字符串中具有奇数长度的异常?

1 个答案:

答案 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