2010-11-06 2 views
1

Я все еще работаю над правильно функционирующим прослушивателем ICMP и озадачиваю, как бороться с «контентом». Мой первый подход заключался в том, чтобы вывести данные из буфера в соответствующее (сначала массив) поле (uint и т. Д.), А затем изменить порядок байтов, прежде чем передавать данные в соответствующий элемент BitConverter. Хотя он работает, он не очень изящный.Как бороться с 'Endianness'

Второй подход состоял в том, чтобы подготовить весь буфер, управляемый двухмерным массивом, содержащим положение и длину полей, которые необходимо отрегулировать. Это тоже работает, с дополнительным преимуществом, что существующий код не нуждается в изменениях, но ему не хватает (строго) читаемости.

Я прилагаю все усилия, чтобы понять новые среды программирования, доступные сегодня (в частности .Net и C#), и я очень удивлен тем, что проблемы, существовавшие еще в 1975 году, по-прежнему не рассматриваются надлежащим образом. У меня была одна из первых (ISA) сетевых карт (ориентированных на Ethernet 1.0 и основанная на процессоре Motorola 68000), разработанная для ПК (IBM), и я четко помню связанные с этим проблемы; а не только многословные базовые типы, но все данные были в разных «endiannnes» (тогда 16-битные слова), что фактически убивало возможность «DMA» данных.

Я считаю, что это очень небольшое усилие на той части, которую играет сетевой адаптер, для настройки данных, соответствующих его окружению, но, похоже, это не слишком большая проблема для решения этой проблемы. (?)

Нижняя линия; Я не могу поверить, что я единственный, кто обременен этим, и я искренне надеюсь, что кто-то придумал лучшее решение, чем те, которые я использую сейчас.

(этот текст он переведен с помощью Google Translate (как я голландская))

+1

Не только вы обременены этой проблемой :-) См. http://stackoverflow.com/questions/217980/c-little-endian-or-big-endian as Что ж. – Vlad

ответ

0

Подход Java, это просто сделать все большую Endian даже если аппаратное обеспечение не является. Для большинства других языков требуется преобразование между хостом и сетевым порядком. Я не вижу, как вы могли бы сделать сетевой адаптер, потому что он не знал структуру данных. Только до тех пор, пока вы не достигнете уровня приложения, у вас есть вся информация, необходимая для преобразования.

Итак, да, мы все застряли, делая то, что вы здесь делаете.

+0

(спасибо Владу и Джотну) Должно быть, я был глуп; Мой адаптер находится в моей системе, и моя ОС загружена; но он (адаптер) не смог бы распознать свою среду? Я знаю, что это так, но это приемлемо? – Nebbukadnezzar

+0

Адаптер не знает приложения, а структура данных, передаваемых по сети, определяется приложением. Ваше приложение может отправлять небольшие данные, если он хочет, но все стандартизируются на большом конце. – JOTN

2

Просто; не используйте BitConverter, если есть вероятность того, что проблема Endianness станет проблемой (что для .NET в основном означает «моно на каком-то оборудовании» AFAIK). У Jon Skeet есть EndianBitConverter в «MiscUtil», который может помочь; в противном случае просто выполните кодирование с помощью бит-сдвига и т. д.

+0

Спасибо за это; Я посмотрю на это, но каково ваше мнение о «реальном» решении? – Nebbukadnezzar