1

我是一个白手起家的程序员,因此我对位和字节以及十六进制值了解不多。

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

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

这些实际值是由服务发送的还是需要进一步转换?我应该怎么做才能获得实际值?

4

2 回答 2

2

我不会尝试回答有关您的字节值的含义或它们是否“正确”的问题,因为鉴于此处提供的信息,我们无法知道。相反,我将逐步引导您完成转换,以回答您的问题“这些实际值是由服务发送的吗?”

Abyte[]是一个字节数组 - 一个“字节数组”。

数组是一组固定大小的值。

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因此,如果您的服务返回一个字节数组并且您看到的值类似于也可以表示为十进制的 45(以 10 为底)。

简短的回答,尽管您没有告诉我们任何事情,是的,这些十六进制值确实代表了从服务接收到的实际值。

于 2012-09-19T13:34:42.210 回答
1

要将字节数组转换为十六进制字符串,使用内置方法可能会更好BitConvertor.ToString(byte[])

但是,Web 方法返回的实际值的类型为byte[]. 将其转换为十六进制字符串只是表示它的另一种方式。

将其显示为逗号分隔的十进制字节值列表可能更方便。

byte[] returnValue = ...
var commaDelimmitedListOfByteValues =
    string.Join(",", returnValue.Select(v => c.ToString()));

这会给你类似的东西"1,254,23,67,111,23,..."

byte[]在不知道返回的内容和原因的情况下,我们无法推测 the 的“真实”含义。


在这种情况下,物有所值


    "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” = ' - '

一切都是猜测。

于 2012-09-19T13:48:01.153 回答