【问题标题】:Making sense of hexadecimal value理解十六进制值
【发布时间】:2012-09-19 13:23:41
【问题描述】:

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

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

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

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

【问题讨论】:

  • What should I do to get the actual values? - 我们不知道。这些代表什么?
  • 所需的预期结果是什么?
  • 学习的好时机。
  • 鉴于你的方法被称为 ByteArrayToHexString 它看起来像是它的工作对我来说
  • 正如@Oded 所说,我们不可能知道任意byte Array 中的bytes 代表什么以及它们是否正确。无论哪种方式,将字节转换为十六进制文字字符串都没有多大帮助。 Web 方法的签名是什么,您希望它做什么? byte[] 可以是任何其他类型的二进制序列化,也可以是其他类型。

标签: c# .net hex


【解决方案1】:

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

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(十六进制),也可以用十进制(以 10 为底)表示为 45。

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

【讨论】:

  • 是的,buf[0] 是 0x00(十进制 0),buf[1] 是 0x22(十进制 34)。这与我的回答有何关系?
  • 这只是一个问题。而且价值不大,所以我要删除。谢谢。
  • 我意识到如果不了解底层结构,我的问题就无法回答。我将接受此信息作为答案。谢谢。
【解决方案2】:

要将字节数组转换为十六进制字符串,最好使用内置的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" = '-'

一切都是猜测。

【讨论】:

  • “反序列化”一词的错误用法
猜你喜欢
  • 2021-02-19
  • 2019-02-27
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 2018-07-18
相关资源
最近更新 更多