Little and Big Endian в Java (android)


Я создаю приложение с помощью Android Studio, и в моем проекте мне нужно сделать много преобразований, таких как short/int в байтовые массивы. Я также хочу, чтобы мое приложение получало данные от робота, который закодирован в C, и робот отправляет структуру, которая имеет много uint16-32, int16-32.... Я нашел много сообщений и кодов, которые помогли мне преобразовать мои атрибуты в bytearray, но я всегда вижу, что люди говорят о маленьком и Большом Endian, и я не могу понять разницу. Если бы кто-нибудь мог мне это объяснить .... NB : робот отправляет данные через Wi-Fi сокет по протоколу TCP

3 2

3 ответа:

Малый Эндиан и большой Эндиан просто относятся к порядку, в котором представленыбайты структуры данных.

Представьте на мгновение, что у вас есть 16-разрядное целое число, которое представлено шестнадцатеричным значением 0xabcd. Поскольку 8 бит = 1 байт, мы имеем наше целое число, состоящее из двух байтов, ab и cd. В большой Эндианской системе наиболее значимые байты помещаются в Нижний адрес памяти, в то время как в маленьких Эндианских системах мы помещаем их в верхний.

Показать это визуально, предположим, что мы поместили наше целое число в адрес памяти 0.

В большой Эндианской системе наша память выглядела бы так:

Memory address  -> |  0 |  1 |
Value           -> | ab | cd |

В маленькой Эндианской системе это выглядело бы так:

Memory address  -> |  0 |  1 |
Value           -> | cd | ab |

Традиционно порядок байтов в сети является большим Эндианом.

При преобразовании целого числа в поток байтов целое число обычно делится на байты и байты передаются один за другим. Если первый отправленный байт содержит наименее значимые биты, то он является малым эндианом. Если первый отправленный байт содержит наиболее значимые биты, то это big endian. В little endian 1 будет представлен байтами 1, за которыми следует байт, содержащий 0. (Поскольку байты могут быть представлены двумя шестнадцатеричными цифрами, они часто представляются таким образом.) Итак, короткое целое число 1 преобразуется в байты 01 00, а короткое целое число 256 становится байтами 00 01 в little endian. В big endian поток байтов для 1 равен 00 01, а 256 становится 01 00.

См. https://en.wikipedia.org/wiki/Endianness

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 );

Полный код смотрите здесь: Программа для чтения и хранения большого и малого эндиана