Подтвердить что ты не робот

Является ли Java целыми числами в маленьком концевом или большом конце?

Я прошу, потому что я посылаю поток байтов из процесса C в Java. На стороне C 32-битное целое число LSB является первым байтом, а MSB - четвертым байтом.

Итак, мой вопрос на стороне Java, когда мы читаем байт, когда он был отправлен из процесса C, что на стороне Java является endian?

Следующий вопрос, если endian на стороне Java не совпадает с отправленным, как я могу конвертировать между ними?

4b9b3361

Ответ 1

Используйте сетевой байтовый порядок (большой endian), который так же, как и Java. См. Man htons для разных переводчиков в C.

Ответ 2

Я споткнулся здесь через Google и получил ответ, что Java - большой эндинец.

Прочитав ответы, я хотел бы указать, что байты действительно имеют порядковый номер, хотя, к счастью, если вы имеете дело только с "основными" микропроцессорами, вы вряд ли когда-либо сталкивались с ним, как Intel, Motorola, и Zilog все согласились с направлением сдвига своих чипов UART и что MSB байта будет 2 ** 7, а LSB будет 2 ** 0 в своих процессорах (я использовал обозначение мощности FORTRAN, чтобы подчеркнуть, сколько лет этот материал: )).

Я столкнулся с этой проблемой с некоторыми последовательными данными нисходящей линии связи Space Shuttle 20+ лет назад, когда мы заменили аппаратное обеспечение $10 тыс. на компьютер Mac. Об этом недавно опубликован технический бюллетень NASA Tech. Я просто использовал таблицу поиска по 256 элементам с перевернутыми битами (таблица [0x01] = 0x80 и т.д.) После того, как каждый байт был смещен из битового потока.

Ответ 3

В Java нет целых без знака (все они подписаны и в Big Endian).

На стороне C каждый байт имеет LSB в начале слева и MSB в конце.

Похоже, вы используете LSB как наименее значимый бит, не так ли? LSB обычно обозначает младший байт. Endianness не основано на битах, а байт.

Чтобы преобразовать из беззнакового байта в целое число Java:

int i = (int) b & 0xFF;

Чтобы преобразовать из 32-разрядного малознакового числа без знака в байтах [] в Java длиной (с верхней части головы, не проверено):

long l = (long)b[0] & 0xFF;
l += ((long)b[1] & 0xFF) << 8;
l += ((long)b[2] & 0xFF) << 16;
l += ((long)b[3] & 0xFF) << 24;

Ответ 4

Невозможно повлиять на что-либо в Java, так как нет (прямого не-API) способа сопоставить некоторые байты непосредственно в int в Java.

Каждый API, который делает это или что-то подобное, определяет поведение довольно точно, поэтому вы должны найти документацию по этому API.

Ответ 5

Я буду читать байты один за другим и объединять их в значение long. Таким образом, вы контролируете соответствие, и процесс коммуникации прозрачен.

Ответ 6

Если он подходит к используемому протоколу, рассмотрите возможность использования DataInputStream, где поведение очень хорошо определено.