C#Endian敏感吗?

例如,C#是否对Endian敏感,将代码如下:

int a = 1234567; short b = *(short*)&i; 

始终为b分配相同的值。 如果是这样,它会有什么价值?

如果没有,如果带有指针的代码,有什么好方法可以处理字节序?

C#没有定义字节序。 实际上,是的,它可能总是小端(IIRC即使在IA64上,但我没有检查过),但理想情况下,如果字节序很重要,你应该理想地检查BitConverter.IsLittleEndian – 或者只是使用位移等而不是直接存储器访问。

引用protobuf-net(尚未提交的版本)的几行:

 WriteInt64(*(long*)&value); if (!BitConverter.IsLittleEndian) { // not fully tested, but this *should* work Reverse(ioBuffer, ioIndex - 8, 8); } 

即它检查字节顺序并在必要时进行翻转。

是的,我相信代码字节序敏感的。 b的值将是little-endian处理器上最不重要的字节,以及big-endian处理器上最重要的字节。 为了使这更容易看到,让我们切换到hex:

 using System; class Test { unsafe static void Main() { int a = 0x12345678; short b = *(short*)&a; Console.WriteLine(b.ToString("x")); } } 

在我的x86盒子上,打印“5678”表示最不重要的字节位于a的vaue的“开始”。 如果你在以big-endian模式运行的处理器上运行相同的代码(可能在Mono下),我希望它能打印“1234”。

据我所知,C#和Common Language Infrastructure规范都没有基于指针的按位和数学运算的字节顺序要求。 CLI确实声明存储在MSIL可执行文件中的二进制数据必须采用小端格式。 并且文档的一般漂移表明代码不应该依赖于任何特定的内存表示(包括打包或解包的数组等),除非在特殊情况下。

你真的不应该在C#中做指针调整。 您应该在询问代码之前尝试编译代码。