2015-10-11 2 views
1

Я пытаюсь дублировать байт String, который я создаю в Objective-C (на iOS) в Java, но у меня проблемы. Вот строка, я хочу, чтобы произвести:Проблема, повторяющая байтовую строку в Java с ByteBuffer

"\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" 

Я получаю эту строку из массива 4 целых чисел - [1,1,0,0] - где каждое целое число имеет 4 байта. Посмотрев на кучу вопросов, на здесь, я пытался строить эту строку в Java с помощью ByteBuffer следующим образом:

ByteBuffer bytes = ByteBuffer.allocate(16); 
bytes.putInt(1); 
bytes.putInt(1); 
bytes.putInt(0); 
bytes.putInt(0); 

String byteString = new String(bytes.array()); 

Однако это дает мне:

"\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00" 

Когда я распаковывать, что, массив ints я получаю [16777216, 16777216, 0, 0]. Очевидно, я делаю что-то неправильно, и я надеюсь, что кто-то может указать мне в правильном направлении.

+0

Использование строки для хранения байт не рекомендуется. Когда вы передаете массив байтов в [new String] (https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#String-byte:A-), вы используете платформу по умолчанию для декодирования этих байтов в символы, и любые последовательности байтов, которые являются недопустимыми для этой кодировки, будут декодированы в String как «?» или " ". Эти конкретные байты не имеют этой проблемы, но, возможно, все байты выше 0x7f. – VGR

ответ

5

iOS является малоподвижным, поэтому первым является младший байт 4-байтового целого.

Java ByteBufferdefaults to big-endian, так что имеет место обратное.

Первоначальный заказ буфера байт всегда BIG_ENDIAN

Вы можете изменить это с помощью

bytes.order(ByteOrder.LITTLE_ENDIAN); 
+0

Ах, вот и все. Благодаря! – tvalent2

+0

Это хорошо. – hagrawal

0

Что вы хотите:

ByteBuffer bytes = ByteBuffer.allocate(16); 
bytes.putInt(16777216); 
bytes.putInt(16777216); 
bytes.putInt(0); 
bytes.putInt(0); 

String byteString = new String(bytes.array()); 

порядок байт платформ отличаются, поэтому, когда вы кладете 4 байта в байты перепутаны.

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