理解十六进制值

时间:2012-09-19 13:23:41

标签: c# .net hex

我是一个自制程序员,因此我不太了解位和字节以及十六进制值。

我使用的其中一个库从远程服务接收数据作为字节数组。我找到了一种转换这个字节数组数据的方法:

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

服务是否发送了这些实际值,还是需要进一步转换?我该怎么做才能得到实际值?

2 个答案:

答案 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”=' - '

一切都是猜测。