Я создаю приложение с помощью Android Studio, и в моем проекте мне нужно сделать так много преобразований, как короткие/int в байтовые массивы. Я также хочу, чтобы мое приложение получало данные от робота, который закодирован на C, и робот отправляет структуру с большим количеством uint16-32, int16-32 .... Я нашел много сообщений и кодов, которые помогли я преобразовываю свои атрибуты в bytearray, но я всегда вижу, что люди говорят о Маленьком и Большом Эндиан, и я не могу понять разницу. Если кто-то может объяснить это мне .... NB: робот отправляет данные через Wi-Fi-сокет с протоколом TCPМаленький и большой эндиан в Java (android)
ответ
Little Endian и Big Endian просто относятся к порядку, в котором байт структуры данных представлены ,
Представьте себе, что у вас есть 16-разрядное целое число, которое представлено шестнадцатеричным значением 0xabcd. Поскольку 8 бит = 1 байт, наше целое состоит из двух байтов, ab и cd. В системе Big Endian наиболее важные байты помещаются в нижний адрес памяти, тогда как в системах Little Endian мы помещаем их в более высокий.
Чтобы показать это наглядно, предположим, что мы ставим число по адресу памяти 0.
В системе Big Endian, наша память будет выглядеть следующим образом:
Memory address -> | 0 | 1 |
Value -> | ab | cd |
В Little Endian системы, это будет выглядеть так:
Memory address -> | 0 | 1 |
Value -> | cd | ab |
Традиционно, порядок байтов сети - большой Endian.
и Android (родной) Endian. – DragonLord
При преобразовании целого числа в поток байтов целое число обычно делится на байты, а байты отправляются по одному. Если первый отправленный байт содержит младшие значащие биты, он немного сужен. Если первый отправленный байт содержит самые значащие биты, он является большим аргументом. В little endian 1 будет отображаться байтами 1, за которым следует байт, содержащий 0. (Так как байты могут быть представлены двумя шестнадцатеричными цифрами, они часто представлены таким образом.) Таким образом, короткое целое число 1 преобразуется в байты 01 00 и короткое целое число 256 становится байтами 00 01 в маленьком конце. В большой Endian поток байт 1 00 01 и 256 01 00. становится
String path=”root/subdir/filename.extension”;
File f=new File(path);
RandomAccessFile raf=new RandomAccessFile(f,”r”);
ByteBuffer bb;
char c;
int i;
ch=raf.readChar();
bb=ByteBuffer.allocate(4); //4 byte buffer
bb.order(ByteOrder.BIG_ENDIAN);
bb.putChar(ch); //store 2 byte unsigned value in byte buffer and reach 2
position forward //in buffer
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.position(0); //goto start of buffer again for reading
ch=bb.getChar(); //retrieve 2 byte unsigned value from byte buffer
i=(int) ch; //always store a 2-byte unsigned value (e.g.unsigned char) into
a 4-byte signed //datatype to avoid storing as 2’s compliment negative no.
//now 4 byte integer ‘i’ contains a 2-byte unsigned +ve integer value for
processing
System.out.println(“2 byte unsigned int value=”,i);
для полного кода смотрите здесь: program to read and store big and little endian
чтения https://en.wikipedia.org/wiki/Endianness или http://stackoverflow.com/questions/22030657/little-endian-vs- широкоформатные и смежные вопросы. «Int» требует 4 байта, endianess - о том, упорядочены ли они 0, 1, 2, 3 или 3, 2, 1, 0 (например, в потоке байтов, например, через сокет) – zapl