【问题标题】:Mono EndiannessMono Endianness
【发布时间】:2011-07-22 12:18:25
【问题描述】:

使用 .NET 时事情相当简单 - 一切(包括 ARM ASFAIK)都运行 little endian。

我的问题是:Mono 和(可能)大端系统发生了什么? Int32 / Int64 结构中的位是否反转(与 x86 相比)或框架是否强制小端规则集?

谢谢

【问题讨论】:

  • 我猜它将由 CLR 规范定义
  • 它无法隐藏字节顺序,太贵了。请参阅 BitConverter.IsLittleEndian。

标签: c# .net mono endianness


【解决方案1】:

我目前能想到的行为变化列表(未经检查且不完整):

当然还有使用这些的每个(运行时库)函数。

通常,Microsoft 不会在其文档中提及字节顺序 - 有一些奇怪的例外。例如,BinaryReader.ReadUInt16 被定义为读取小端。没有提到其他方法。有人可能会假设二进制序列化始终是小端,即使在大端机器上也是如此。

请注意,XBox360 上的 XNA 是 big-endian,所以这不仅仅是 Mono 的理论问题。

【讨论】:

  • 听起来我需要做一些测试......谁有一个安装了 linux / mono 的 ARM cpu 的工作良好的 QEMU 映像?
【解决方案2】:

要知道字节是否“反转”,只需检查BitConverter.IsLittleEndian

if (BitConverter.IsLittleEndian)
{
    // reverse bytes
}

【讨论】:

    【解决方案3】:

    您关于所有 MS .NET 都是小端的断言是不正确的。这取决于您运行的架构 - CLR 规范是这样说的:

    来自 CLI 注释标准 (p.161) — 第 I 部分,第 12.6.3 节:“字节排序”:

    对于大于 1 字节的数据类型,字节顺序取决于目标 CPU。依赖于字节顺序的代码可能无法在所有平台上运行。 [...]

    (取自this SO答案)

    有关BitConverter 的内部结构以及它如何处理字节序的更多信息,请参阅this 答案。

    【讨论】:

    • 这带来了一个有趣的问题:“..取决于目标 CPU...” 那么在 Big Endian ARM CPU 上运行的 Little Endian 窗口上运行 mono 会发生什么? link微软支持论坛
    • 这不是 CLI 规范而不是 CLR 规范吗? (您引用的部分是 CLI。)这一切都表明 CLI 规范提供了大端实现的可能性。这与 CLR 的所有风格(即 Microsoft 的实现)都是 little-endian 的命题并不矛盾。据我所知,他们都是。您是否知道任何受支持的大端 Microsoft .NET 实现? (我认为Rotor,又名SSCLI 支持它,但那不是CLR。)
    【解决方案4】:

    考虑到 .Net 和 Mono 在设计上有多相似,我想说它们可能处理相同的字节序。

    您始终可以通过创建具有已知值的托管 int 来测试它,然后使用反射或编组来访问内存并进行查看。

    【讨论】:

    • 我唯一的问题是访问带有框架的大端系统:) 我特别想做的是将整数转换为字节数组——数组需要以大端顺序运行;由于代码可能会在某个时候出现在大端系统上,因此我试图确保在不需要时不会反转字节。
    【解决方案5】:

    c#/.Net 不对字节序提出任何要求。 int32/64 是原子而不是结构。

    【讨论】:

      【解决方案6】:

      据我所知,这种转换会发生在您的代码范围之外并且对您隐藏。出于某些原因,包括此类潜在问题,它被称为“托管代码”。

      【讨论】:

      • 字节序影响代码的地方很多。 BitConverterBuffer.BlockCopy、不安全代码等
      猜你喜欢
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      相关资源
      最近更新 更多