例如,C# 是否对 Endian 敏感,将编写如下代码:
int a = 1234567;
short b = *(short*)&i;
始终为 b 分配相同的值。如果是这样,它将是什么价值?
如果没有,如果代码中有指针,有什么好的方法来处理字节顺序?
例如,C# 是否对 Endian 敏感,将编写如下代码:
int a = 1234567;
short b = *(short*)&i;
始终为 b 分配相同的值。如果是这样,它将是什么价值?
如果没有,如果代码中有指针,有什么好的方法来处理字节顺序?
C# 没有定义字节顺序。实际上,是的,它可能总是小端(即使在 IA64 上也是 IIRC,但我没有检查过),但理想情况下,您应该检查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 处理器上的最高有效字节。为了让这个更容易看,让我们切换到十六进制:
using System;
class Test
{
unsafe static void Main()
{
int a = 0x12345678;
short b = *(short*)&a;
Console.WriteLine(b.ToString("x"));
}
}
在我的 x86 机器上,打印出“5678”,表明最不重要的字节位于a
. 如果您在以大端模式(可能在 Mono 下)运行的处理器上运行相同的代码,我希望它会打印“1234”。
据我所知,C# 和公共语言基础设施规范都没有对基于指针的位和数学运算的字节序要求。CLI 确实声明存储在 MSIL 可执行文件中的二进制数据必须采用小端格式。并且文档的一般偏差表明代码不应该依赖于任何特定的内存表示(包括打包或解包数组等),除非在特殊情况下。
你真的不应该在 C# 中进行指针调配。在询问它会做什么之前,您应该尝试编译您的代码。