单一字节序

9

使用.NET,一切都相当简单 - 包括ARM ASFAIK,在这里都是小端序。

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

谢谢


1
我猜它将由CLR规范定义。 - Greg B
1
它无法隐藏字节序,代价太高。请参见BitConverter.IsLittleEndian。 - Hans Passant
6个回答

13

你声称所有的MS .NET都是小端序是不正确的。这取决于你运行的架构-CLR规范如此规定:

来自CLI Annotated Standard(第161页)-第I部分,第12.6.3节:“字节顺序”:

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

(摘自this SO答案)

有关BitConverter内部和它如何处理字节顺序的更多信息,请参见this答案。


1
这带来了一个有趣的问题:“..依赖于目标CPU...”那么在大端ARM CPU上运行的小端Windows上运行的mono会发生什么情况?链接 MSFT支持论坛 - arthur
这不是CLI规范而不是CLR规范吗?(你引用的部分说的是CLI。)所有这些只是证明了CLI规范可以容纳大端实现的可能性。这并不反驳所有CLR版本(即Microsoft的实现)都是小端的命题。据我所知,它们都是小端的。您是否知道任何受支持的Microsoft .NET实现是大端的?(我认为Rotor,又名SSCLI支持它,但那不是CLR。) - Ian Griffiths

4
我能想到的行为变化列表(未经检查和不完整)如下:

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

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

请注意,XBox360 上的 XNA 是 大端字节序,因此这不仅仅是 Mono 的理论问题。


听起来我需要做一些测试...有人有一个在ARM CPU上安装了Linux / Mono的良好工作的QEMU镜像吗? - arthur

3

c#/.Net并不涉及字节序问题。int32/64是原子类型而非结构体。


2
要知道字节是否“反转”,只需检查BitConverter.IsLittleEndian
if (BitConverter.IsLittleEndian)
{
    // reverse bytes
}

2
据我所知,这种转换将发生在您的代码范围之外,并且对您来说是隐藏的。它被称为“托管代码”,其中包括潜在的问题。

1
有许多地方受字节序影响,例如BitConverterBuffer.BlockCopy、不安全代码等。 - CodesInChaos

0
考虑到 .Net 和 Mono 在设计上有多么相似,我想它们处理字节序可能是相同的。
您始终可以通过创建一个已知值的托管 int,然后使用反射或封送来访问内存并查看它来进行测试。

我唯一的问题是访问一个带有框架的大端系统 :) 我要做的具体事情是将整数转换为字节数组--数组需要按照大端顺序排列才能正常工作;由于代码可能最终会在大端系统上运行,因此我正在努力确保在不需要时不会颠倒字节。 - arthur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接