【问题标题】:Delphi - Odd Hex Length in String after converting from Buffer to Hex?Delphi - 从缓冲区转换为十六进制后字符串中的奇数十六进制长度?
【发布时间】:2016-10-15 19:46:40
【问题描述】:

情况: 我正在从 ws2_32 挂钩 Send() 和 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;

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

【问题讨论】:

标签: delphi


【解决方案1】:

您的函数返回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

【讨论】:

  • 完美无瑕!而且您的解决方案实际上更小!难以置信 :D 这是新的输出:i.imgur.com/a79ZGMc.png - 深表感谢!
猜你喜欢
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 2018-01-22
  • 2018-01-31
  • 1970-01-01
  • 2014-03-19
  • 2019-07-27
相关资源
最近更新 更多