2016-05-19 6 views
2

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

+0

чтения 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

ответ

2

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.

+1

и Android (родной) Endian. – DragonLord

1

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

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

0
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

 Смежные вопросы

  • Нет связанных вопросов^_^