Чтение и запись из байтового потока, если порядок данных отличается от порядкового номера текущей машины - PullRequest
0 голосов
/ 29 марта 2010

У меня есть поток байтов, который содержит флаг, который определяет порядок данных в заголовке. Я хочу прочитать дубликаты из потока, которые, вероятно, должны будут отличаться, если порядковый номер данных в заголовке отличается?

В настоящее время я использую BinaryReader и вызываю ReadDouble для чтения данных из потока, но если флаг порядка байтов указывает, что поток данных имеет иной порядок байтов, чем архитектура машины, то, вероятно, это не будет работать?

Как это должно быть обработано? Должен ли я проверять порядковый номер моих данных по сравнению с текущим компьютером, тогда, когда я хочу прочитать двойное число, вместо этого прочитайте необработанные байты в байтовый массив и выполните array.Reverse, чтобы перевернуть данные перед использованием BitConverter.ToDouble () с обращенным данные и смещение нуля?

Я мог бы просто проверить это, но у меня нет источника данных для обоих порядков байтов, поэтому я немного обеспокоен созданием тестовых данных для проверки синтаксического анализа, и это отличается от того, как могут выглядеть «реальные» данные.

Ответы [ 2 ]

1 голос
/ 29 марта 2010

если флаг порядка байтов указывает, что поток данных имеет порядок байтов, отличный от архитектуры машины, то, вероятно, это не будет работать?

Первое - порядок битов от вас абстрагирован. Если вы не вертитесь, вам все равно.

Порядок байтов - это совсем другое. Для 4-байтового количества он может быть первым младшим байтом или первым старшим байтом. Я не знаю, что использует ReadDouble (), но если вы используете BinaryReader на одном конце провода и BinaryWriter на другом, то, опять же, вам все равно. Он должен быть написан в том же порядке, в котором он читается, без учета порядка байтов.

Мне кажется, единственный случай, когда вам не все равно, если вы не используете .NET на другом конце провода. В этом случае вы должны убедиться, что байты находятся в правильном порядке, используя схему, аналогичную описанной вами. (Array.Reverse и т. Д.).

Обычно приложения, которые сталкиваются с этой проблемой, используют многобайтовую подпись для четкого указания порядка. Другими словами, запишите 0x01020304 в поток, и на стороне читателя, если вы получите 0x04030201, вы знаете, что у вас есть разница в порядке байтов.

Я мог бы просто проверить это, но у меня нет источника данных для обоих порядков байтов ...

Ну, ты должен это исправить. Вы не можете развиваться без возможности проверить то, что вы разрабатываете. Также возникает вопрос: если у вас нет источника, который использовал бы другой порядок байтов, то почему вы вообще обеспокоены этой проблемой?

Смотри также:
- Обратный порядок байтов в .NET
- Класс для выбора порядка байтов BitConverter

0 голосов
/ 29 марта 2010

BinaryReader читает данные (включая двойные) с прямым порядком байтов:

BinaryReader .. ::. ReadDouble

BinaryReader читает этот тип данных в формате с прямым порядком байтов.

Если вы хотите читать данные BigEndian, вы можете переопределить методы BinaryReader или добавить перегрузки с помощью аргумента enum, чтобы указать ожидаемую последовательность.

Чтобы реализовать чтение по порядку следования bing, вы можете посмотреть ответ Cheeso или выполнить обратный инжиниринг.

...