C#Endian敏感吗?

Mar*_*tin 12 c# pointers endianness

例如,C#是否会以Endian敏感,代码如下:

int a = 1234567;
short b = *(short*)&i;
Run Code Online (Sandbox Code Playgroud)

始终为b分配相同的值.如果是这样,那将是什么价值?

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

Mar*_*ell 15

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);
}
Run Code Online (Sandbox Code Playgroud)

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


Jon*_*eet 6

是的,我认为代码尾数敏感.值b将是little-endian处理器上最不重要的字节,以及big-endian处理器上最重要的字节.为了使这更容易看到,让我们切换到十六进制:

using System;

class Test
{
    unsafe static void Main()
    {
        int a = 0x12345678;
        short b = *(short*)&a;
        Console.WriteLine(b.ToString("x"));
    }
}
Run Code Online (Sandbox Code Playgroud)

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