Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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
如何从VB.NET中的十六进制字符串获取数据包?_Vb.net - Fatal编程技术网

如何从VB.NET中的十六进制字符串获取数据包?

如何从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

我从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组不同的数据,它在十六进制中工作良好

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)
。这有意义吗?它确实起作用了。我看我在我的例子中错了。是的,这是有道理的。只要对所有三个整数都这样做,而不仅仅是第一个整数,并且只要您希望它是一个无符号整数而不是有符号整数,就可以很好地工作。