Я все еще работаю над правильно функционирующим прослушивателем ICMP и озадачиваю, как бороться с «контентом». Мой первый подход заключался в том, чтобы вывести данные из буфера в соответствующее (сначала массив) поле (uint и т. Д.), А затем изменить порядок байтов, прежде чем передавать данные в соответствующий элемент BitConverter. Хотя он работает, он не очень изящный.Как бороться с 'Endianness'
Второй подход состоял в том, чтобы подготовить весь буфер, управляемый двухмерным массивом, содержащим положение и длину полей, которые необходимо отрегулировать. Это тоже работает, с дополнительным преимуществом, что существующий код не нуждается в изменениях, но ему не хватает (строго) читаемости.
Я прилагаю все усилия, чтобы понять новые среды программирования, доступные сегодня (в частности .Net и C#), и я очень удивлен тем, что проблемы, существовавшие еще в 1975 году, по-прежнему не рассматриваются надлежащим образом. У меня была одна из первых (ISA) сетевых карт (ориентированных на Ethernet 1.0 и основанная на процессоре Motorola 68000), разработанная для ПК (IBM), и я четко помню связанные с этим проблемы; а не только многословные базовые типы, но все данные были в разных «endiannnes» (тогда 16-битные слова), что фактически убивало возможность «DMA» данных.
Я считаю, что это очень небольшое усилие на той части, которую играет сетевой адаптер, для настройки данных, соответствующих его окружению, но, похоже, это не слишком большая проблема для решения этой проблемы. (?)
Нижняя линия; Я не могу поверить, что я единственный, кто обременен этим, и я искренне надеюсь, что кто-то придумал лучшее решение, чем те, которые я использую сейчас.
(этот текст он переведен с помощью Google Translate (как я голландская))
Не только вы обременены этой проблемой :-) См. http://stackoverflow.com/questions/217980/c-little-endian-or-big-endian as Что ж. – Vlad