将字符串发送到其十六进制等效项

时间:2016-02-23 01:12:50

标签: vb.net serial-port hex byte

我想将hex个命令发送到我的设备,因为它只能理解hex

因此我设法创建一个功能,可以验证用户输入的string是否具有有效对应的hex。问题是here

因此,通过验证users input是否具有相应的hex等效值,我相信我的设备会读取系统发送的内容。 By searching我意识到它需要转换为字节,它表示

  

使用ASCIIEncoding类将字符串转换为字节数组   你可以传播。

     
    

代码:

  
Dim str as String = "12345678"
Dim bytes() as Byte = ASCIIEncoding.ASCII.GetBytes(strNumbers)
' Then Send te bytes to the reader
sp.Write(bytes, 0, bytes.Length)
  

您不需要将值转换为HEX,在这种情况下,HEX是   显然是一种表达同样事物的不同方式。

我的代码:

'This is a string with corresponding hex value
Dim msg_cmd as string  = "A0038204D7" 
'Convert it to byte so my device can read it
Dim process_CMD() As Byte = ASCIIEncoding.ASCII.GetBytes(msg_cmd) 
'Send it as bytes
ComPort.Write(process_CMD, 0, process_CMD.Length) 

我的输出:

41 30 30 33 38 32 30 34 44 37

期望的输出:

A0 03 82 04 D7

1 个答案:

答案 0 :(得分:4)

要发送特定的字节序列,请不要发送字符串 - 只需发送字节:

Dim process_CMD() As Byte = { &HA0, &H03, &H82, &H04, &HD7 }
ComPort.Write(process_CMD, 0, process_CMD.Length)

正如我在上面的评论中提到的,值只是数值。十六进制没什么特别的。十六进制只是表示相同值的另一种方式。换句话说,上面的代码与此完全相同:

Dim process_CMD() As Byte = { 160, 3, 130, 4, 215 }
ComPort.Write(process_CMD, 0, process_CMD.Length)

如果字符串中包含十六进制数字,则可以使用Convert.ToByte方法的appropriate overload将十六进制数字的字符串表示形式转换为字节值。但是,它一次只能转换一个字节,因此,首先需要将字符串拆分为字节(每个字节两个十六进制数字。例如:

Dim input As String = "A0038204D7"
Dim bytes As New List(Of Byte)()
For i As Integer = 0 to input.Length Step 2
    bytes.Add(Convert.ToByte(input.SubString(i, 2), 16)
Next
Dim process_CMD() As Byte = bytes.ToArray()
ComPort.Write(process_CMD, 0, process_CMD.Length)

但是,如果字符串在字节之间有空格会更容易。然后你可以使用String.Split方法:

Dim input As String = "A0 03 82 04 D7"
Dim hexBytes As String() = input.Split(" "c)
Dim bytes As New List(Of Byte)()
For Each hexByte As String in hexBytes
    bytes.Add(Convert.ToByte(hexByte, 16)
Next
Dim process_CMD() As Byte = bytes.ToArray()
ComPort.Write(process_CMD, 0, process_CMD.Length)

或者更简单:

Dim input As String = "A0 03 82 04 D7"
Dim process_CMD() As Byte = input.Split(" "c).Select(Function(x) Convert.ToByte(x, 16)).ToArray()
ComPort.Write(process_CMD, 0, process_CMD.Length)