我是一个自制程序员,因此我不太了解位和字节以及十六进制值。
我使用的其中一个库从远程服务接收数据作为字节数组。我找到了一种转换这个字节数组数据的方法:
public string ByteArrayToHexString(byte[] buf)
{
if (buf == null) return "";
StringBuilder sb = new StringBuilder(buf.Length * 2 + 2);
for (int i = 0; i < buf.Length; i++)
{
sb.Append(buf[i].ToString("x2"));
}
return sb.ToString();
}
使用这种方法,我得到这样的字符串:
0031
或
0022
或
002d
服务是否发送了这些实际值,还是需要进一步转换?我该怎么做才能得到实际值?
答案 0 :(得分:2)
我将不会尝试回答关于你的字节值意味着什么,或者它们是否“正确”的问题,因为根据这里提供的信息,我们无法知道。相反,我将逐步引导您完成转换,以回答您的问题“服务是否发送了这些实际值?”
byte[]
是一个字节数组 - 一个“字节数组”。
数组是固定大小的值集。
C#中的byte
对象是一个值,其范围介于十进制数0和255之间。
所以“字节数组”实际上只是一串数字,按顺序,所有数字都在0到255之间。
十六进制值只是可视化字节数组的一种方法。
(为了完全清楚,十六进制为16,十进制为10。)
以下列中的数字是等效的。
decimal 0 5 10 15 16 20 26 255
decimal 0 05 10 15 16 20 26 255 (padded with zero)
hex 0 5 a f 10 14 1A FF
hex 0 05 0a 0f 10 14 1A FF (padded with zero)
想象一下具有以下十进制值的字节数组:
4, 12, 255, 1, 0
这相当于具有以下十六进制值的字节数组:
4, c, ff, 1, 0
这也可以写成:
04, 0c, ff, 01, 00
或更常见的是:
0x04, 0x0c, 0xff, 0x01, 0x00
或:
04 0c ff 01 00
或:
040cff0100
因此,如果您的服务返回一个字节数组并且您看到002d
之类的值,那意味着您收到两个字节,第一个字节为0(0在基数10和基数16中相同),第二个字节是2d(十六进制),也可以用十进制表示为45(基数为10)。
简短回答,即使您没有告诉我们任何事情,是的,这些十六进制值确实代表从服务中收到的实际值。
答案 1 :(得分:1)
要将字节数组转换为十六进制字符串,您可能最好使用内置的BitConvertor.ToString(byte[])
方法。
但是,Web方法返回的实际值的类型为byte[]
。将其转换为十六进制字符串只是表示它的另一种方式。
将它显示为以逗号分隔的十进制字节值列表可能更方便。
byte[] returnValue = ...
var commaDelimmitedListOfByteValues =
string.Join(",", returnValue.Select(v => c.ToString()));
这会让你感觉像"1,254,23,67,111,23,..."
。
我们无法推测byte[]
的“真实”含义,而不知道它是从哪里返回的,为什么会这样。
在这种情况下,值得的是
"0031" //Your Hex String
"00-31" //BitConvertor Hex String
{ 0, 49 } //Array Inline Initializer
"0,49" //Comma delimited list of decimal byte values
49 //Possible conversion to an Int32
'1' //Possible conversion to a Char
所有这些都可以是返回值的有效表示。
可能是那个吗?
“0031”=' 1 '
“0022”='“'
“002d”=' - '
一切都是猜测。