Little and Big Endian в Java (android)
Я создаю приложение с помощью Android Studio, и в моем проекте мне нужно сделать много преобразований, таких как short/int в байтовые массивы. Я также хочу, чтобы мое приложение получало данные от робота, который закодирован в C, и робот отправляет структуру, которая имеет много uint16-32, int16-32.... Я нашел много сообщений и кодов, которые помогли мне преобразовать мои атрибуты в bytearray, но я всегда вижу, что люди говорят о маленьком и Большом Endian, и я не могу понять разницу. Если бы кто-нибудь мог мне это объяснить .... NB : робот отправляет данные через Wi-Fi сокет по протоколу TCP
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.
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 );
Полный код смотрите здесь: Программа для чтения и хранения большого и малого эндиана