我仍在努力建立一个功能正常的ICMP监听器,并解决如何处理'endianness'问题。我的第一种方法是将数据从缓冲区中取出到适当的(最初的数组)字段(uint等),然后在将数据传递给相应的BitConverter成员之前反转字节顺序。虽然它有效,但它不是很优雅。
第二种方法是准备由二维数组驱动的整个缓冲区,其中包含需要调整的字段的位置和长度。这也有效,并且现有代码不需要更改,但缺乏(严重)可读性。
我正在努力了解今天可用的新编程环境(特别是.Net和C#),我很惊讶1975年存在的问题仍未得到妥善处理。我有一台针对(IBM)PC开发的第一个(ISA)网卡(针对以太网1.0并基于Motorola 68000 CPU),我清楚地记得所涉及的问题;不仅仅是多字基类型,而且所有数据都使用不同的'endiannnes'(然后是16位字),有效地消除了'DMA'数据的可能性。
我认为这是一个非常小的努力,在网络适配器播放的部分,调整适合其环境的数据,但这样解决它似乎不是太大的问题。 (?)
底线;我无法相信我是唯一一个背负着这个问题的人,我真诚地希望有人能提出比我现在使用的解决方案更好的解决方案。
(这篇文章是在Google翻译的帮助下翻译的(因为我是荷兰语))
答案 0 :(得分:2)
简单;如果存在Endianness存在问题的远程机会(对于.NET主要意味着“在某些硬件上使用单声道”AFAIK),请不要使用BitConverter。 Jon Skeet在“MiscUtil”中有一个可能有帮助的EndianBitConverter;否则只需通过位移等进行编码。
答案 1 :(得分:0)
即使硬件不是,Java方法也只是制作大端的所有东西。大多数其他语言都要求您在主机和网络顺序之间进行转换。我不知道如何让网络适配器这样做,因为它不知道数据的结构。只有到达应用程序层,才能获得进行转换所需的所有信息。
所以,是的,我们都在坚持做你在这里做的事情。