首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Delphi中将十六进制字符串转换为十六进制数据?

如何在Delphi中将十六进制字符串转换为十六进制数据?
EN

Stack Overflow用户
提问于 2018-03-20 07:56:55
回答 1查看 1.4K关注 0票数 0

我使用的是TComPort库,为了向设备发送请求,我需要发送十六进制数据格式的命令,如下所示

代码语言:javascript
复制
procedure TForm1.Button3Click(Sender: TObject);
begin
  ComPort1.WriteStr(#$D5#$D5);
end;  

但这是一个硬编码的例子。

如何将S转换为ComPort1.WriteStr的有效值

代码语言:javascript
复制
procedure TForm1.Button3Click(Sender: TObject);
var
  S:String;
begin
  Edit1.Text:='D5 D5';
  ComPort1.WriteStr(Edit1.Text);
end;  
EN

回答 1

Stack Overflow用户

发布于 2018-03-20 08:11:14

您不会通过端口发送实际的十六进制字符串。这只是编译时在源代码中编码二进制数据的一种方式。#$D5#$D5使用数值213 (取决于{$HIGHCHARUNICODE} )对2个字符串字符进行编码。

TComPort.WriteStr()需要发送实际字节,而不是十六进制字符串。如果您希望用户输入十六进制字符串,然后将其作为二进制数据发送,请查看用于该转换的Delphi的HexToBin()函数。

也就是说,请注意Delphi中的string是16位的Unicode,而不是8位的2009+。你应该使用TComPort.Write()而不是TComPort.WriteStr()来发送二进制数据,例如:

代码语言:javascript
复制
procedure TForm1.Button3Click(Sender: TObject);
var
  buf: array[0..1] of Byte;
begin
  buf[0] := $D5;
  buf[1] := $D5;
  ComPort1.Write(buf, 2);
end;  

但是,TComPort.WriteStr()将接受16位Unicode字符串,并通过简单地剥离每个Char的高8位来将其作为8位二进制字符串进行传输。因此,如果你发送一个包含两个Char($D5)值的字符串,它将被作为2字节的$D5 $D5发送。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49374294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档