java中bitconverter_BitConverter.GetBytes 方法以什么顺序返回字节数组

前言

我在“浅谈 ZipInteger”一文中的 ZipInteger 结构中使用了 BitConverter 类的 GetBytes 方法。当时我是假设 GetBytes 方法根据 IsLittleEndian 的值不同而按照不同的顺序返回字节数组。但是 MSDN 有关 BitConverter 类的文档中没有对此作出明确的说明。请参见我在 MSDN 论坛的一个贴子“请问 BitConverter.GetBytes 方法以什么顺序返回字节数组”:

在 MSDN 文档的“BigInteger 构造函数 (Byte[])”中提到:

value 数组中的各个字节应该为 little-endian 顺序,从最低序位字节到最高序位字节。

将数值转换为字节数组的大多数方法,例如 BigInteger.ToByteArray 和 BitConverter.GetBytes,以 little-endian 顺序返回字节数组。

按照我的理解,该 MSDN 文档认为 BitConverter.GetBytes 方法总是以 little-endian 顺序返回字节数组,而不管 BitConverter.IsLittleEndian 的值如何。

而在 BitConverter 类的文档中并没有明确指出 BitConverter.GetBytes 方法应该以什么顺序返回字节数组。

不知我的理解是否正确。

该贴子并没有得到靠谱的答复。

测试程序

那么,我们写个程序来测试一下吧。下面就是 BitConverterTester.cs:

using System;

namespace Skyiv.Tester

{

static class BitConverterTester

{

static void Main()

{

Console.WriteLine(" OS Version: " + Environment.OSVersion);

Console.WriteLine(" CLR Version: " + Environment.Version);

Console.WriteLine(" IsLittleEndian: " + BitConverter.IsLittleEndian);

long n = 0x1234567890ABCDEF;

double d = 1;

Console.WriteLine(n.ToString("X") + ": " + BitConverter.ToString(BitConverter.GetBytes(n)));

Console.WriteLine(d.ToString("F14") + ": " + BitConverter.ToString(BitConverter.GetBytes(d)));

}

}

}

这个程序在 Windows Server 2003 操作系统的 .NET Framework 4 环境下编译和运行:

C:\CS\BitConverterTester> csc BitConverterTester.cs

Microsoft(R) Visual C# 2010 编译器 4.0.30319.1 版

版权所有(C) Microsoft Corporation。保留所有权利。

C:\CS\BitConverterTester> BitConverterTester

OS Version: Microsoft Windows NT 5.2.3790 Service Pack 2

CLR Version: 4.0.30319.1

IsLittleEndian: True

1234567890ABCDEF: EF-CD-AB-90-78-56-34-12

1.00000000000000: 00-00-00-00-00-00-F0-3F

C:\CS\BitConverterTester>

在 Ubuntu 10.10 操作系统的 Mono 2.8.2 环境下编译和运行:

ben@ben-m4000t:~/work/BitConverterTester$ dmcs BitConverterTester.cs

ben@ben-m4000t:~/work/BitConverterTester$ mono28 BitConverterTester.exe

OS Version: Unix 2.6.35.24

CLR Version: 4.0.30319.1

IsLittleEndian: True

1234567890ABCDEF: EF-CD-AB-90-78-56-34-12

1.00000000000000: 00-00-00-00-00-00-F0-3F

ben@ben-m4000t:~/work/BitConverterTester$

这两次运行的结果都在预料之中,BitConverter 类的 GetBytes 方法以 Little-Endian 顺序返回字节数组。但是,在这两次运行中,IsLittleEndian 的值都为 True,所以还是没有解决我们的问题。

查看 Microsoft .NET Framework 4 中相关的源程序代码

9bb0496fcf9582552da02bf4b1ce3596.png

在 mscorlib.dll 的 System 命名空间下找到 BitConverter 类:

3b2c5721ccb56eb7debf3f6d3fe2a8c3.png

如上图如示,IsLittleEndian 是 BitConverter 类的静态只读字段。

508d038eadf168cdf7aa09ae51a58554.png

如上图所示,在 BitConverter 类的静态构造函数中,直接把 IsLittleEndian 这个静态只读字段的值赋值为 true。由于我没有 Microsoft 实现 BitConverter 类的 C# 源程序代码,不知道是 Microsoft 的 C# 源程序中就是直接这样写呢,还是实际上是有根据平台来判断的,但是 C# 编译器在具体平台上优化了这段代码。

cdcd8220b56ee4d20b18a32e52785cf8.png

如上图所示,GetBytes(Int64) 方法也非常简单,直接通过不安全的指针转换就得到了相应的字节数组。学过 C 语言中的朋友想必非常熟悉这种做法。这下清楚了,BitConverter 类的 GetBytes 方法是根据 IsLittleEndian 的值的不同按照不同顺序来返回字节数组的。MSDN 文档在“BigInteger 构造函数 (Byte[]) ”中的相关说法:“例如 BigInteger.ToByteArray 和 BitConverter.GetBytes,以 little-endian 顺序返回字节数组”是不正确的。

继续看下去:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值