Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何在Delphi中将十六进制字符串转换为十六进制数据?_String_Delphi_Hex - Fatal编程技术网

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

String 如何在Delphi中将十六进制字符串转换为十六进制数据?,string,delphi,hex,String,Delphi,Hex,我正在使用TComPort库,向需要以十六进制数据发送命令的设备发送请求,如下面的示例所示 procedure TForm1.Button3Click(Sender: TObject); begin ComPort1.WriteStr(#$D5#$D5); end; 但这是一个硬编码的例子 如何将S转换为ComPort1.WriteStr procedure TForm1.Button3Click(Sender: TObject); var S:String; begin Ed

我正在使用TComPort库,向需要以十六进制数据发送命令的设备发送请求,如下面的示例所示

procedure TForm1.Button3Click(Sender: TObject);
begin
  ComPort1.WriteStr(#$D5#$D5);
end;  
但这是一个硬编码的例子

如何将
S
转换为
ComPort1.WriteStr

procedure TForm1.Button3Click(Sender: TObject);
var
  S:String;
begin
  Edit1.Text:='D5 D5';
  ComPort1.WriteStr(Edit1.Text);
end;  

您不会通过端口发送实际的十六进制字符串。这只是在编译时在源代码中对二进制数据进行编码的一种方法
#$D5#$D5
正在编码数值为
213
的两个字符串字符(取决于,默认情况下关闭)

t导入.writest()
希望发送的是实际字节,而不是十六进制字符串。如果希望用户输入十六进制字符串,然后将其作为二进制数据发送,请查看Delphi的函数进行转换

尽管如此,请注意Delphi 2009+中的
string
是16位Unicode,而不是8位ANSI。您应该使用
t导入.Write()
来发送二进制数据,而不是
t导入.writest()
,例如:

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

但是,
t导入.WriteStr()
将接受一个16位的Unicode字符串,并通过简单地剥离每个
字符的上8位,将其作为8位二进制字符串传输。因此,如果您发送一个包含两个
Char($D5)
值的字符串,它将以2字节的形式发送
$D5$D5

您不会通过端口发送实际的十六进制字符串。这只是在编译时在源代码中对二进制数据进行编码的一种方法
#$D5#$D5
正在编码数值为
213
的两个字符串字符(取决于,默认情况下关闭)

t导入.writest()
希望发送的是实际字节,而不是十六进制字符串。如果希望用户输入十六进制字符串,然后将其作为二进制数据发送,请查看Delphi的函数进行转换

尽管如此,请注意Delphi 2009+中的
string
是16位Unicode,而不是8位ANSI。您应该使用
t导入.Write()
来发送二进制数据,而不是
t导入.writest()
,例如:

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

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

您好,很抱歉延迟,我还不太清楚,我正在尝试使用
HexToBin(PWideChar(hextr),bytes,Length(bytes))
then
ComPort1.Write(字节,长度(字节))但未按预期转换请确保
hextr
的长度是2的偶数倍,并且仅包含十六进制数字(
0..9
a..f
a..f
),不包含空格的其他字符。而
bytes
被预先分配到至少
Length(HexStr)div2
字节的大小。我找到了一种方法来实现我所寻找的:
for I:=0到(Length(HexStr)div2-1)do a:=a+Chr(Byte(stroint('$'+Copy(HexStr,(I*2)+1,2))您好,抱歉耽搁了,我还不太清楚,我正在尝试使用
HexToBin(PWideChar(hextr),bytes,Length(bytes))
then
ComPort1.Write(字节,长度(字节))但未按预期转换请确保
hextr
的长度是2的偶数倍,并且仅包含十六进制数字(
0..9
a..f
a..f
),不包含空格的其他字符。而
bytes
被预先分配到至少
Length(HexStr)div2
字节的大小。我找到了一种方法来实现我所寻找的:
for I:=0到(Length(HexStr)div2-1)do a:=a+Chr(Byte(stroint('$'+Copy(HexStr,(I*2)+1,2))