Я спрашиваю, потому что отправляю поток байтов из процесса C в Java. На стороне C 32-битное целое число имеет LSB - это первый байт, а MSB - это 4-й байт.
Итак, мой вопрос: на стороне Java, когда мы читаем байт, который был отправлен из процесса C, что такое порядок байтов на стороне Java?
Последующий вопрос: если порядок байтов на стороне Java не совпадает с отправленным, как я могу конвертировать между ними?
java
endianness
хафез
источник
источник
Ответы:
Используйте сетевой порядок байтов (прямой порядок байтов), который в любом случае такой же, как и в Java. См. Man htons для различных переводчиков в C.
источник
Я наткнулся здесь через Google и получил ответ, что Java является прямым порядком байтов .
Читая ответы, я хотел бы отметить, что байты действительно имеют порядок следования байтов, хотя, к счастью, если вы имели дело только с «массовыми» микропроцессорами, вы вряд ли когда-либо сталкивались с этим, поскольку Intel, Motorola и Zilog все согласились с направлением сдвига своих микросхем UART и что MSB байта будет,
2**7
а LSB будет2**0
в их процессорах (я использовал обозначение мощности FORTRAN, чтобы подчеркнуть, сколько лет этому материалу :)).Я столкнулся с этой проблемой с некоторыми последовательными данными нисходящего канала Space Shuttle более 20 лет назад, когда мы заменили интерфейсное оборудование стоимостью 10 тысяч долларов на компьютер Mac. Об этом давно опубликован доклад NASA Tech. Я просто использовал поисковую таблицу из 256 элементов с перевернутыми битами (
table[0x01]=0x80
и т. Д.) После того, как каждый байт был сдвинут из потока битов.источник
В Java нет целых чисел без знака. Все целые числа подписаны и имеют прямой порядок байтов.
Похоже, вы используете LSB как младший бит, не так ли? LSB обычно обозначает младший байт. Порядок байтов основан не на битах, а на байтах.
Чтобы преобразовать из байта без знака в целое число Java:
int i = (int) b & 0xFF;
Чтобы преобразовать из беззнакового 32-битного little-endian в byte [] в Java long (из верхней части моей головы, не тестировалось):
long l = (long)b[0] & 0xFF; l += ((long)b[1] & 0xFF) << 8; l += ((long)b[2] & 0xFF) << 16; l += ((long)b[3] & 0xFF) << 24;
источник
Это никак не может повлиять на что-либо в Java, поскольку в Java нет способа (прямого, не связанного с API) отображать некоторые байты непосредственно в int.
Каждый API, который делает это или что-то подобное, довольно точно определяет поведение, поэтому вам следует поискать документацию по этому API.
источник
Я читал байты один за другим и объединял их в длинное значение. Таким образом, вы контролируете порядок байтов, и процесс коммуникации становится прозрачным.
источник
Если он соответствует используемому вами протоколу, рассмотрите возможность использования DataInputStream, где поведение очень хорошо определено .
источник
Как отмечалось выше, Java имеет "обратный порядок байтов". Это означает, что MSB int находится слева, если вы исследуете память (по крайней мере, на процессоре Intel). Знаковый бит также находится в MSB для всех целочисленных типов Java.
Чтение 4-байтового беззнакового целого числа из двоичного файла, хранящегося в системе с прямым порядком байтов, требует некоторой адаптации в Java. ReadInt () DataInputStream ожидает формат с прямым порядком байтов.
Вот пример, который считывает четырехбайтовое беззнаковое значение (как показано HexEdit как 01 00 00 00) в целое число со значением 1:
// Declare an array of 4 shorts to hold the four unsigned bytes short[] tempShort = new short[4]; for (int b = 0; b < 4; b++) { tempShort[b] = (short)dIStream.readUnsignedByte(); } int curVal = convToInt(tempShort); // Pass an array of four shorts which convert from LSB first public int convToInt(short[] sb) { int answer = sb[0]; answer += sb[1] << 8; answer += sb[2] << 16; answer += sb[3] << 24; return answer; }
источник
java force действительно big endian: https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.11
источник
byte[] bbb = ByteBuffer.allocate(4).putFloat(0.42f).array();
создалbyte
массив, противоположный тому, что былоC/C++
создано мной . Следовательно, обратный порядок байтов Java действует даже в данных во время выполнения.