C# 如何处理';Endianness';

C# 如何处理';Endianness';,c#,endianness,C#,Endianness,我仍在开发一个功能正常的ICMP侦听器,并对如何处理“endianness”感到困惑。我的第一种方法是将数据从缓冲区中取出,放入适当的(最初是数组)字段(uint等),然后颠倒字节顺序,然后将数据传递给适当的位转换器成员。虽然它能工作,但它不是很优雅 第二种方法是准备由二维数组驱动的整个缓冲区,其中包含需要调整的字段的位置和长度。这也行得通,还有一个额外的优点,即现有代码不需要更改,但可读性(严重)不足 我正在努力了解当今可用的新编程环境(特别是.Net和C#),我非常惊讶于1975年存在的问题

我仍在开发一个功能正常的ICMP侦听器,并对如何处理“endianness”感到困惑。我的第一种方法是将数据从缓冲区中取出,放入适当的(最初是数组)字段(uint等),然后颠倒字节顺序,然后将数据传递给适当的位转换器成员。虽然它能工作,但它不是很优雅

第二种方法是准备由二维数组驱动的整个缓冲区,其中包含需要调整的字段的位置和长度。这也行得通,还有一个额外的优点,即现有代码不需要更改,但可读性(严重)不足

我正在努力了解当今可用的新编程环境(特别是.Net和C#),我非常惊讶于1975年存在的问题仍然没有得到适当的处理。我有第一个(ISA)网卡(针对Ethernet 1.0,基于摩托罗拉68000 CPU),是为(IBM)PC开发的,我清楚地记得其中涉及的问题;不仅是多字基类型,而且所有数据都在不同的“endiannnes”(然后是16位字)中,有效地消除了“DMA”数据的可能性

我认为这是一个非常小的努力,在一个网络适配器播放,调整适当的数据,它的环境,但似乎不是太大的问题来解决它。(?)

底线;我不敢相信我是唯一一个背负这个重担的人,我真诚地希望有人能想出一个比我现在使用的更好的解决方案


(本文是在Google translate(我是荷兰人)的帮助下翻译的)

Java方法就是让所有东西都是big-endian,即使硬件不是。大多数其他语言要求您在主机和网络顺序之间进行转换。我不明白如何让网络适配器来做,因为它不知道数据的结构。只有在到达应用层之前,您才拥有进行转换所需的所有信息


所以,是的,我们都在做你在这里做的事情

简单;如果Endianness有可能成为一个问题(对于.NET来说主要是指“某些硬件上的mono”AFAIK),请不要使用位转换器。Jon Skeet在“MiscUtil”中有一个EndianBitConverter,这可能会有所帮助;否则,只需通过位移位等方式进行编码。

不仅您有这个问题的负担:-)请参见。(感谢Vlad和Jotn)我一定很愚蠢;我的适配器在我的系统中,我的操作系统已加载;但它(适配器)将无法识别其环境?我知道,但这是可以接受的吗?适配器不知道应用程序,通过网络发送的数据的结构由应用程序决定。如果需要,你的应用程序可以发送小的endian数据,但是每个人都在big endian上进行标准化;我会调查一下,但你对“真正的”解决方案有什么看法?