如何从VB.NET中的十六进制字符串获取数据包?
我从PLC上得到一个十六进制字符串。数据来自3个传感器,字符串长度为12个字符。例如00150C950137,因此传感器的数据为0015、0C95和0137 我很容易地转换了前4个,但当我尝试转换第2个和第3个时,它会给我一个错误。这就是我正在使用的:如何从VB.NET中的十六进制字符串获取数据包?,vb.net,Vb.net,我从PLC上得到一个十六进制字符串。数据来自3个传感器,字符串长度为12个字符。例如00150C950137,因此传感器的数据为0015、0C95和0137 我很容易地转换了前4个,但当我尝试转换第2个和第3个时,它会给我一个错误。这就是我正在使用的: ResData.Text = strRes & ": " & strRes.Substring(0, 4) & " - " & strRes.Substring(4, 4) & " - " & st
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组不同的数据,它在十六进制中工作良好
lbl1转换也可以工作。例如0015给了我21。问题来自lbl2和prg1。它说:
中发生类型为“System.OverflowException”的未处理异常
mscorlib.dll
其他信息:值对于一个对象太大或太小
无符号字节
有什么想法吗?提前谢谢 问题在于,您试图将其转换为四位十六进制数,转换为单个
字节。十六进制数中的每个数字的范围为0到F(0到15)。因此,一个两位十进制的十六进制数可以从0到FF(0到255)。Byte
类型仅允许0到255之间的值。换句话说,十六进制字符串中的每个两位数对代表一个字节。因此,在您的示例中,数字00150C950137表示六个字节:
00 15 0C 95 01 37
当您从十六进制字符串转换为字节
时,只允许小于等于FF的值。任何大于FF的值都将抛出一个OverflowException
。如果需要获取四位十六进制字符串的数值,那不是字节,而是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)
但是,在读取多个字节时,您可能需要同时考虑当前平台和发送数据的平台的(字节顺序)。Convert.ToByte()
只处理字节(即最多FF)。您的第一个示例恰好有效,因为它小于FF(即小于255最大值)。要转换为FFFF,您可以使用ToUInt32()
您使用的是vb.net还是vba?开始时stres的值是多少。此外,那些“.ToString”命令没有任何作用,因为子字符串会吐出一个字符串。错误是不言自明的,字节只能是0-255,非常感谢。工作得很好。我已经有好几十年没有用过这个了。实际上,我使用Dim val1作为UShort=Convert.ToUInt16(strRes.Substring(0,4),16)
。这有意义吗?它确实起作用了。我看我在我的例子中错了。是的,这是有道理的。只要对所有三个整数都这样做,而不仅仅是第一个整数,并且只要您希望它是一个无符号整数而不是有符号整数,就可以很好地工作。