【问题标题】:Is C# Endian sensitive?C# Endian 敏感吗?
【发布时间】:2011-01-15 21:58:54
【问题描述】:

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

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

始终为 b 分配相同的值。如果有,它的价值是多少?

如果不是,如果代码中有指针,有什么好的方法来处理字节顺序?

【问题讨论】:

  • 哎呀,你不能在 C# 中做指针的乐趣:)
  • @cwap:如果你想弄脏你可以使用unsafe块中的指针。
  • 您可以使用不安全的块。这是一个相当学术的问题,因为据我所知,没有在不同字节序架构上实现 C#,但仍然很有趣。
  • Mono 可能不得不处理这些东西。
  • 你可以在 C# 中做指针,有时我需要为了效率:(

标签: c# pointers endianness


【解决方案1】:

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);
}

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

【讨论】:

  • 对,所以基本上假设小端(因为这是最常见的情况)并在必要时进行直接内存访问之前进行交换?
  • @Martin - 确实如此。针对您期望的内容进行优化(如果合适/必要),但最好同时支持。或者至少在某个时候抛出一个明显的异常。
  • 当然,我可以将编译器块放入并在编译时设置条件。因为这是在程序执行期间不会改变的东西;)
  • @Martin - 你总是在同一台机器上编译吗?
  • 不,实际上其中一台机器是xbox,当然不能编译。但是,如果我手动设置目标平台字节序并编译,这有关系吗?
【解决方案2】:

是的,我相信代码 是字节序敏感的。 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”。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      您真的不应该在 C# 中进行指针调动。你应该在询问它会做什么之前尝试编译你的代码。

      【讨论】:

      • 我知道它在我的特定机器上做了什么。但是,我想知道它是否会在 all 机器上做同样的事情。在我的机器上运行它并只是假设是非常糟糕的做法,特别是考虑到我知道这是一个硬件敏感问题。请尝试实际回答问题?
      • 如上所述,指针在不安全的块中非常合适。
      • 答案是“你不应该”。从int 转换为short 如果你想转换东西,真的没有理由在C#中做指针技巧。
      • “你不应该”嗯?你的意思和“你不应该使用 goto”一样吗?
      • 例如,在这种情况下,我将 7 位整数打包成一个 64 位整数,并带有 1 位填充。使用指针稍微容易一些...
      猜你喜欢
      • 2018-03-02
      • 1970-01-01
      • 2019-01-12
      • 2010-12-20
      • 2018-05-16
      • 2011-03-13
      • 2013-09-24
      • 2013-06-09
      • 2012-03-11
      相关资源
      最近更新 更多