如何从VB.NET中的HEX字符串中获取数据包?

时间:2015-04-28 11:32:53

标签: vb.net

我从PLC获取十六进制字符串。数据来自3个传感器,字符串长度为12个字符。例如00150C950137,因此传感器的数据为0015,0C95和0137。

我轻松转换了前4个但是当我尝试转换第2个和第3个时它给了我一个错误。这就是我正在使用的:

ResData.Text = strRes & ": " & strRes.Substring(0, 4) & " - " & strRes.Substring(4, 4) & " - " & strRes.Substring(8, 4)

Dim lbl1 = strRes.Substring(0, 4).ToString
lbl1 = Convert.ToByte(lbl1, 16)

Dim lbl2 = strRes.Substring(4, 4).ToString
lbl2 = Convert.ToByte(lbl2, 16)

Dim prg1 = strRes.Substring(8, 4).ToString
prg1 = Convert.ToByte(prg1, 16)

Label1.Text = "Plug Catcher: " & lbl1 & " psi"
Label3.Text = "Manifold: " & lbl2 & " psi"
MyVerticalProgessBar1.Value = prg1

第一行是显示整个字符串以及3个不同的数据组,它在HEX中工作正常。

lbl1转换也有效。例如0015给我21.问题来自lbl2和prg1。它说:

  

未处理的类型' System.OverflowException'发生在   mscorlib.dll中

     

其他信息:价值太大或太小了   无符号字节。

有什么想法吗?提前谢谢!

1 个答案:

答案 0 :(得分:3)

问题在于您尝试将其转换为四位十六进制数字转换为单个Byte。十六进制数中的每个数字的范围为0到F(0到15)。因此,两位十进制十六进制数的范围可以是0到FF(0到255)。 Byte类型仅允许0到255之间的值。换句话说,十六进制字符串中的每两位数对表示一个字节。因此,在您的示例中,数字00150C950137代表六个字节:

 00 15 0C 95 01 37

当您从十六进制字符串转换为Byte时,只允许最多为FF的值。任何大于FF的东西都会抛出OverflowException。如果需要获取四位十六进制字符串的数值,那不是Byte,那就是一个16位整数(一个字节是8位)。在VB.NET中,16位整数的类型称为ShortUShort。所以,例如:

Console.WriteLine(Convert.ToByte("00FF", 16))   ' Writes 255
Console.WriteLine(Convert.ToUInt16("00FF", 16)) ' Writes 255
Console.WriteLine(Convert.ToUInt16("0100", 16)) ' Writes 256
Console.WriteLine(Convert.ToByte("0100", 16))   ' Throws an OverflowException

所以,如果你需要全部四位数字,你可能希望它是一个无符号的16位UShort,如下所示:

Dim val1 As UShort = Convert.ToUInt16(strRes.Substring(0, 4), 16)
Dim val2 As UShort = Convert.ToUInt16(strRes.Substring(4, 4), 16)
Dim val3 As UShort = Convert.ToUInt16(strRes.Substring(8, 4), 16)

但是,当读取多个字节时,您可能需要关心当前平台和发送数据的平台的endianness(字节顺序)。