2016-05-19 8 views
2

Ich baue eine App mit Android Studio und in meinem Projekt muss ich eine Menge Konvertierungen wie short/int zu Byte-Arrays. Ich möchte auch, dass meine App Daten von einem Roboter empfängt, der in C codiert ist, und der Roboter sendet eine Struktur, die eine Menge von uint16-32, int16-32 .... enthält. Ich habe viele Beiträge und Codes gefunden, die geholfen haben Ich konvertiere meine Attribute in Bytearray, aber ich sehe immer Leute, die über Little und Big Endian sprechen, und ich kann den Unterschied nicht erfassen. Wenn jemand mir das erklären könnte .... NB: Der Roboter sendet Daten über einen Wifi-Socket mit TCP-ProtokollLittle und Big Endian in Java (Android)

+0

lesen https://en.wikipedia.org/wiki/Endianness oder http://stackoverflow.com/questions/22030657/little-endian-vs- big-endian und verwandte Fragen. Ein 'int' benötigt 4 Bytes, Endianess ist, ob sie 0, 1, 2, 3 oder 3, 2, 1, 0 sind (zB in einem Bytestrom wie über einen Socket) – zapl

Antwort

2

Little Endian und Big Endian auf die Reihenfolge beziehen werden, in dem die Bytes eine Datenstruktur dargestellt werden .

Stellen Sie sich vor, Sie hätten eine 16-Bit-Ganzzahl, die durch den Hexadezimalwert 0xabcd dargestellt wird. Weil 8 Bits = 1 Byte sind, besteht unsere Ganzzahl aus zwei Bytes, ab und cd. In einem Big-Endian-System werden die signifikantesten Bytes in der unteren Speicheradresse platziert, während in Little-Endian-Systemen diese in die höhere gesetzt werden.

dies visuell zeigen, gehen wir von unserer ganzen Zahl an der Adressenspeicher gesetzt haben 0.

In einem Big-Endian-System würde unser Gedächtnis wie folgt aussehen:

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

In einem Little-Endian System würde es wie folgt aussehen:

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

Traditionell ist Netzwerk-Byte-Reihenfolge Big Endian.

+1

und Android (nativ) ist Little- Endian. – DragonLord

1

Bei der Umwandlung einer Ganzzahl in einen Byte-Stream wird die ganze Zahl normalerweise in Bytes aufgeteilt und die Bytes gesendet Einer nach dem anderen. Wenn das erste gesendete Byte die niedrigstwertigen Bits enthält, ist es Little Endian. Wenn das erste gesendete Byte die höchstwertigen Bits enthält, ist es Big-Endian. Im Little Endian würde 1 durch die Bytes 1 gefolgt von einem Byte mit 0 dargestellt werden. (Da Bytes durch zwei hexadezimale Ziffern dargestellt werden können, werden sie oft auf diese Weise dargestellt.) So wird die kurze Ganzzahl 1 in die Bytes 01 00 umgewandelt und die kurze ganze Zahl 256 wird zu den Bytes 00 01 in Little Endian. In Big-Endian ist der Byte-Strom für 1 00 01 und 256 01 einfach 00.

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

für vollständigen Code siehe hier: program to read and store big and little endian