有关Endian-ness和.Net的详细信息?

Cor*_*urn 26 c# endianness

我有一些关于endian-ness的问题已经足够相关,我保证将它们作为一个问题加入:

1)字节是由.Net还是由硬件决定的?

2)如果由硬件决定,我怎样才能弄清楚硬件在C#中的端点?

3)endian-ness是否影响二进制交互,如OR,AND,XOR或移位?IE将向右移动一次总是偏离最不重要的位?

4)我对此表示怀疑,但不同版本的.Net框架的字节序有何不同?我假设他们都是一样的,但我已经学会停止假设一些较低级别的细节,比如这个.

如果需要,我可以问这些不同的问题,但我认为任何知道其中一个答案的人可能都知道所有人的答案(或者可以指出我的方向).

Ste*_*ary 31

1)硬件.

2) BitConverter.IsLittleEndian

3)字节顺序不影响按位运算.向右移动正在向最不显着位方向移动.来自Oops评论的更新:但是,字节顺序确实会影响二进制输入和输出.当读取或写入大于一个字节的值(例如,int从a BinaryReader或使用中读取BitConverter)时,您必须考虑字节序.一旦正确读取值,则所有按位操作都正常.

4)大多数.NET版本都是小端.值得注意的例外包括XBox和Mono或Compact Framework支持的一些平台.

  • 我不确定#4是完全正确的.例如,.Net Compact Framework在许多设备上运行,我假设其中一些是big-endian.Mono(虽然不是.Net,但是有效的CLR实现)肯定会在大端平台上运行.我认为Corey在询问字节序是否与.Net的增量版本(例如1.0 .. 4.0)不同 - 答案是否定的 - 它仅取决于硬件. (2认同)
  • 我将第二个@Mark H发表评论.字节序由硬件决定,.Net只会使用它.但是,.Net中的任何类都不会依赖于特定的字节序(或者至少没有类不应该:-)),所以最多可以说它是不可知的,而不是它具有特定的字节序. (2认同)
  • @Oops:如果您读取的字节序的字节序错误,那么无论如何它将是错误的(例如,0x12345678可能被读取为0x78563412)。只要首先正确地读取了数据,按位操作就应该可以。 (2认同)