C# 单端性

C# 单端性,c#,.net,mono,endianness,C#,.net,Mono,Endianness,对于.NET来说,事情相当简单——所有的一切(包括ARM ASFAIK)都运行little endian 我的问题是:Mono和(潜在的)big-endian系统上发生了什么?在Int32/Int64结构中,位是反向的(与x86相比),还是框架强制使用小端规则集 谢谢据我所知,这种转换将发生在代码范围之外,并且对您隐藏。出于某些原因,它被称为“托管代码”,包括这些潜在问题。c#/.Net对endian没有任何声明。int32/64不是原子结构。考虑到.Net和Mono在设计上有多相似,我认为它们

对于.NET来说,事情相当简单——所有的一切(包括ARM ASFAIK)都运行little endian

我的问题是:Mono和(潜在的)big-endian系统上发生了什么?在Int32/Int64结构中,位是反向的(与x86相比),还是框架强制使用小端规则集


谢谢

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

c#/.Net对endian没有任何声明。int32/64不是原子结构。

考虑到.Net和Mono在设计上有多相似,我认为它们处理endianness的方式可能相同


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

您关于所有MS.NET都是little endian的断言是不正确的。这取决于您正在运行的体系结构-CLR规范这样说:

来自CLI注释标准(第161页)-第一部分,第12.6.3节:“字节顺序”:

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

(摘自SO答案)

有关
位转换器
的内部结构以及如何处理endianness的更多信息,请参阅答案。

要知道字节是否“反转”,只需检查
位转换器。IsLittleEndian

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

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

  • 几乎所有
  • 和(EDIT:来自文档:“BinaryReader以little-endian格式读取此数据类型。”)
  • 以默认编码从/到流()读取和写入Unicode的所有内容(编辑:默认定义为little endian)
当然,每个(运行时库)函数都使用这些

通常,微软在他们的文档中没有提到endianness——除了一些奇怪的例外。例如,定义为读取小尾端。没有提到其他方法。有人可能会假设二进制序列化总是小端的,即使在大端机器上也是如此


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

我猜它将由CLR规范定义。它无法隐藏端点,太昂贵了。请参阅BitConverter.IsLittleEndian。我唯一的问题是访问带有框架的big-endian系统:)我特别想做的是将整数转换为字节数组——数组需要按big-endian顺序工作;由于代码可能会在某个时刻出现在big-endian系统上,我试图确保不会在不需要的时候反转字节。这带来了一个有趣的问题:“…依赖于目标CPU…”那么,在big-endian ARM CPU上运行的Little-endian windows上运行mono会发生什么?MSFT对UMIS的支持不是CLI规范而不是CLR规范吗?(您引用的部分是CLI。)所有这一切都表明CLI规范适应了big-endian实现的可能性。这不会与CLR的所有风格(即微软的实现)都是LittleEndian的主张相矛盾。据我所知,他们都是。您是否知道任何受支持的Microsoft.NET实现都是big-endian的?(我认为Rotor,又名SSCLI支持它,但那不是CLR。)听起来我需要做一些测试。。。有人有一个很好的安装了linux/mono的ARM cpu QEMU映像吗?有很多地方endianness会影响代码<代码>位转换器,
缓冲区。块复制
,不安全代码等。