2010-03-29 2 views
0

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

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

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

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

ответ

1

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

Первый - порядок бит отвлечен от вас. Вам не все равно.

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

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

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

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

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

Смотрите также:
- Reversing byte order in .NET
- A class for choosing the endianness of BitConverter

+0

У меня есть спецификация, в которой указан формат. У меня есть только один пример реализации (так что только один пример endianness в моих данных), но код должен иметь дело с данными, в которых когда-либо был формат. Я не использую .net на обоих концах. действительно, все знают, что у меня есть байт [] в качестве входных данных, и мне нужно разобрать его, чтобы извлечь данные из массива. Первая часть массива - это заголовок, который содержит среди других информации порядок байтов кодированных данных. –

+0

Итак, сделайте следующее: в своем приложении преобразуйте значение массива константного байта (например, '{0xFF, 0xFE, 0x01, 0x02}') в значение Int32. Затем сделайте то же самое с массивом байтов, который вы получили от фактического потока данных. Сравните их. Если они одинаковы, то консенсус один и тот же. Если другое, то вы знаете, что вам нужно отменить. Затем используйте класс для выбора endianness, связанный в ответе выше, в зависимости от ситуации. Это должно сработать. – Cheeso

+0

Спасибо. я могу проверить консистенцию машины или, по крайней мере, сущность, которую будет использовать инфраструктура (BitConverter.IsLittleEndian), я действительно хотел подтвердить, что реверсирование байтов с использованием Array.Reverse и передача их в BitConverter.ToDouble() метод был правильным путем вперед, если сущность не была одинаковой. –

0

BinaryReader считывает данные (в том числе дублей) в небольшой Endian:

BinaryReader..::.ReadDouble

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^