Порядок байтов java / .net - PullRequest
4 голосов
/ 14 мая 2011

При отправке информации из приложения Java в приложение C # через сокеты, отличается ли порядок байтов? Или я могу просто отправить целое число из C # в Java-приложение и прочитать его как целое число?

(И имеет ли значение ОС или то же самое для java / .net, независимо от того, как сама ОС справляется с этим?)

Ответы [ 4 ]

8 голосов
/ 14 мая 2011

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

Любой сериализатор , написанный с учетом переносимости , будет иметь определенный порядок байтов - например, в буферах протоколов (доступных как для Java, так и для C #) всегда используется little-endian независимо от вашего локального оборудования.

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

Если вы используете предварительно консервированные сериализаторы платформы, вы зависите от реализации. Это может быть endian-safe, это может не быть (то есть это может зависеть от платформы на обоих концах). Например, класс .NET BitConverter является не безопасным - обычно предполагается (неправильно), что он является прямым порядком байтов, но на некоторых платформах (и особенно в Mono на некоторых аппаратных средствах) он может быть большим -endian; следовательно, свойство .IsLittleEndian.

Мой совет - использовать сериализатор, который обрабатывает все это для вас; p

3 голосов
/ 14 мая 2011

Java использует Big Endian для некоторых библиотек, таких как DataInput / OutputStream.Все протоколы IP используют Big Endian, что может заставить людей использовать Big Endian по умолчанию для сетевых протоколов.

Однако NIO, ByteBuffer позволяет вам указать BigEndian, LittleEndian или NativeEndian (независимо от того, что система использует по умолчанию)

В системах x86 обычно используется порядок байтов с прямым порядком байтов, поэтому многие приложения Microsoft / Linux по умолчанию используют порядок байтов с прямым порядком байтов, но могут поддерживать порядок с прямым порядком байтов.

3 голосов
/ 14 мая 2011

В Java вы можете использовать DataInputStream или DataOutputStream, которые сначала читают и записывают старший байт, как документировано:

http://download.oracle.com/javase/6/docs/api/java/io/DataOutputStream.html#writeInt%28int%29

Вы должны проверить соответствующую документацию C #, чтобы увидеть, что она делает (или, может быть, кто-то здесь может вам сказать).

В Java вы также можете использовать ByteByffer:

http://download.oracle.com/javase/6/docs/api/java/nio/ByteBuffer.html

... который имеет метод "order", позволяющий вам указать порядок байтов для операций чтения типов многобайтовых примитивов.

0 голосов
/ 14 мая 2011

Да, порядок байтов может быть другим.C # предполагает, что little-endian может использовать порядок байтов платформы, Java имеет тенденцию использовать big-endian.Это обсуждалось ранее на SO.Смотри, например, C # порядковый номер или порядковый номер?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...