#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