【问题标题】:Convert hexadecimal to human readable string with Delphi使用 Delphi 将十六进制转换为人类可读的字符串
【发布时间】:2018-03-15 22:41:40
【问题描述】:

我正在使用组件 TComPort 通过带有 Delphi Berlin 10.1 的 COM 端口读取/写入 RFID 阅读器设备

我是这样写命令的:

procedure TForm1.Button4Click(Sender: TObject);
begin
  ComPort1.WriteStr(#$5A#$FE#$01#$00#$0D#$0A);
end;

这就是我从设备读取响应的方式:

procedure TForm1.ComDataPacket1Packet(Sender: TObject; const Str: string);
var
  str2:String;
  I:Integer;
begin
  for I:=1 to length(str) do
    begin
      str2 := str2+IntToHex(Byte(str[I]),2)+' ';
    end;
  memo1.lines.add(str2);
end;

响应为D5 D5 03 00 82 D2 04 58 01 0D 0A

我认为这意味着 1234 或者至少分析仪是这么说的

但是,如何将该十六进制转换为人类可读的字符串,例如 1234

【问题讨论】:

  • 您能否解释一下我们将如何以 1234 结束该十六进制值? Calc.exe 报告十进制的 1234 是 $4D2。
  • 1234 是十六进制的 $04D2。如果第 6 对是 lsb,第 7 对是 msb,那么剩下的就可以算出来了。
  • ISTM 认为末尾的 0D 0A 可能是 CR+LF,但我不知道其他字节是什么意思。
  • 你肯定有协议描述。 OD 0A 是 CR LF,它通常终止一条消息。
  • 我从分析仪输出中添加了一张图片

标签: string delphi hex


【解决方案1】:

响应为:D5 D5 03 00 82 D2 04 58 01 0D 0A

从您的问题看来,str[6] 是答案相关部分的 lsb,str[7] 持有 msb。

我是怎么得出这个结论的?

1234 是 $04D2 十六进制。最高有效 (msb) 部分是 $04,最低有效 (lsb) 部分是 $D2

到字符串的粗略转换可能是:

s := IntToStr(Byte(str[6]) + Word(str[7])*256); // Outputs 1234

首先,将 lsb 添加到 msb 乘以 256 以形成一个值,然后将其转换为结果字符串。


如果您研究了设备的协议描述,所有这些应该会容易得多。供应商肯定会提供此信息。

【讨论】:

  • 我现在就试一试,但是供应商没有提供有关设备的任何信息,即使我不得不用调试器发现波特率。
  • @MartinOcandoCorleone 那么如果你不知道它是如何通信的,你希望如何与这个设备交互呢?你需要这些信息。供应商必须打算让设备与某物通信,否则它不会有 COM 端口连接。所以必须有人在某个地方记录了设备的通信协议是如何工作的。
  • Remy,支持不回复我的电子邮件,我必须自己找出它是如何工作的,而不是那里的文档,直到现在我有足够的关于它如何工作的信息,感谢 LU现在我可以很好地解码了
猜你喜欢
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
  • 2018-01-31
  • 2018-01-22
  • 1970-01-01
  • 2013-02-07
相关资源
最近更新 更多