читать байтовый массив из C #, который написан из Java - PullRequest
8 голосов
/ 10 мая 2011

Я пытаюсь написать целое число из 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);
}

Ответы [ 2 ]

5 голосов
/ 10 мая 2011

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

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

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

buffer.order(ByteOrder.LITTLE_ENDIAN);

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

2 голосов
/ 10 мая 2011

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

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