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)
即,它检查字节顺序,并在必要时进行翻转.
是的,我认为代码是尾数敏感.值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".