прочитать массив байтов из C #, который написан с Java

#c# #java #bytearray #endianness

#c# #java #массивы #порядковый номер

Вопрос:

Я пытаюсь записать целое число из C # и прочитать его из Java. Целое число составляет 4 байта на обоих языках. Однако, когда я записываю его с C #, целое число 1 записывается в следующих байтах 1000. Это означает, что первый байт равен 1, а остальные равны 0.

Но в Java то же самое записывается как 0001. Первые 3 байта равны 0, а последний равен 1.

Существует ли простой способ чтения и записи на этих языках вместо ручного переворачивания каждых 4 байт? Код для Java

 ByteBuffer buffer = ByteBuffer.allocate(4);
buffer.putInt(1);

for(byte b: buffer.array()){
      System.out.print(b);
}
  

Код для C#

 MemoryStream ms = new MemoryStream();
using(BinaryWriter writer = new BinaryWriter(ms))
{
    writer.Write((int)1);

}
foreach(byte b in ms.ToArray()){
    Console.Write(b);
}
  

Ответ №1:

Вы можете переключить порядковый номер с любой из сторон, чтобы сделать их совместимыми.

Например, на стороне Java вы можете настроить его на использование ByteOrder .LITTLE_ENDIAN (по умолчанию BIG_ENDIAN)

В вашем случае вы можете использовать ByteBuffer.order() для установки порядка.

 buffer.order(ByteOrder.LITTLE_ENDIAN);
  

Или вы можете изменить его на стороне C #, и в этом случае вам придется сделать его в формате Big-Endian, чтобы быть совместимым с java.

Ответ №2:

Как указывает this post, aushttp://kirkwylie.blogspot.com/2008/11/c-binarywriter-is-little-endian-because.html C # BinaryWriter поддерживает только строчный порядковый номер, поэтому вам придется настроить его на сайте Java с помощью метода order http://download.oracle.com/javase/1.4.2/docs/api/java/nio/ByteBuffer.html#order(java.nio.ByteOrder)

Комментарии:

1. Да, вы правы. C # не поддерживает большой порядковый номер. В моем случае я должен выполнить все свои изменения на стороне C #. Итак, я вручную преобразовал, используя System.Net . IP-адрес. HostToNetworkOrder