1

我正在尝试使用Bitconverter类将 a 转换byte arrayhexadecimal值。

long hexValue = 0X780B13436587;
byte[] byteArray = BitConverter.GetBytes ( hexValue );
string hexResult = BitConverter.ToString ( byteArray );

现在如果我逐行执行上面的代码,这就是我看到的

在此处输入图像描述

我认为hexResult字符串将与hexValue相同(即 780B13436587h),但我得到的是不同的,我是否遗漏了什么,如果我错了,请纠正我。

谢谢!

4

3 回答 3

5

字节序。

BitConverter使用 CPU-endianness,这对大多数人来说意味着:little-endian。当人类写数字时,我们倾向于写大端(广义地说:你写千位,然后是数百位,然后是十位,然后是数字)。对于 CPU,big-endian 意味着最高有效字节在前,最低有效字节在最后。但是,除非您使用的是 Itanium,否则您的 CPU 可能是 little-endian,这意味着最高有效字节是last,最低有效字节是first。CPU 的实现使得这无关紧要,除非您在原始内存中窥视 - 它将确保数字和二进制算术仍然按您期望的方式工作。然而,BitConverter 通过窥视原始内存来工作 - 因此您会看到反转的数据。

如果您想要大端格式的值,那么您需要:

  • 以大端顺序手动执行
  • 检查BitConverter.IsLittleEndian值,如果true
    • 要么反转输入字节
    • 或反转输出
于 2014-09-23T14:01:14.783 回答
1

如果您仔细观察,BitConverter 输出中的字节是相反的。

要获取数字的十六进制字符串,请使用 Convert 类:

Convert.ToString(hexValue, 16);
于 2014-09-23T13:53:32.593 回答
1

它是相同的数字,但相反。

BitConverter.ToString 可以以相反的顺序返回字符串表示:http: //msdn.microsoft.com/en-us/library/3a733s97 (v=vs.110).aspx

“value的所有元素都进行了转换。ToString方法返回的十六进制字符串的顺序取决于计算机架构是little-endian还是big-endian。”

于 2014-09-23T13:54:43.817 回答