C#Endian敏感吗?

时间:2010-02-11 21:37:38

标签: c# pointers endianness

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

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

始终为b指定相同的值。如果是这样,那将是什么价值?

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

4 个答案:

答案 0 :(得分: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);
}

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

答案 1 :(得分: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"));
    }
}

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

答案 2 :(得分:1)

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

答案 3 :(得分:-3)

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