我从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中
其他信息:价值太大或太小了 无符号字节。
有什么想法吗?提前谢谢!
答案 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位整数的类型称为Short
和UShort
。所以,例如:
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(字节顺序)。