2016-05-19 2 views
2

Je construis une application en utilisant Android Studio et dans mon projet, j'ai besoin de faire beaucoup de conversions comme des tableaux de court/int à octets. Je veux aussi que mon application reçoive des données d'un robot qui est codé en C, et le robot envoie une structure qui a beaucoup de uint16-32, int16-32 .... J'ai trouvé beaucoup de messages et de codes qui ont aidé Je convertis mes attributs en bytearray mais je vois toujours des gens parler de Little et Big Endian et je n'arrive pas à comprendre la différence. Si quelqu'un pouvait m'expliquer ... NB: le robot envoie des données via un socket Wifi avec protocole TCPLittle and Big Endian en Java (android)

+0

lire https://en.wikipedia.org/wiki/Endianness ou http://stackoverflow.com/questions/22030657/little-endian-vs- big-endian et questions connexes. Un int nécessite 4 octets, endianess est de savoir si elles sont ordonnées 0, 1, 2, 3 ou 3, 2, 1, 0 (par exemple dans un flux d'octets comme sur une socket) – zapl

Répondre

2

Little Endian et Big Endian font simplement référence à l'ordre dans lequel les octets d'une structure de données sont présentées . Imaginez un instant que vous avez un entier de 16 bits représenté par la valeur hexadécimale 0xabcd. Parce que 8 bits = 1 octet, nous avons notre entier est composé de deux octets, ab et cd. Dans un système Big Endian, les octets les plus significatifs sont placés dans l'adresse mémoire inférieure, tandis que dans les systèmes Little Endian, nous les mettons dans l'octet supérieur.

Pour afficher ce visuellement, supposons que nous avons mis notre entier à l'adresse de mémoire 0.

Dans un système Big Endian, notre mémoire ressemblerait à ceci:

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

Dans un Little Endian système, il ressemblerait à ceci:

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

Traditionnellement, l'ordre des octets du réseau est Big Endian.

+1

et Android (natif) est Little- Endian. – DragonLord

1

Lors de la conversion d'un entier en un flux d'octets, l'entier est généralement divisé en octets et les octets sont envoyés un par un. Si le premier octet envoyé contient les bits les moins significatifs, il est peu endian. Si le premier octet envoyé contient les bits les plus significatifs, c'est le gros boutiste. En little endian, 1 serait représenté par les octets 1 suivi d'un octet contenant 0. (Puisque les octets peuvent être représentés par deux chiffres hexadécimaux, ils sont souvent représentés de cette façon.) Donc l'entier court 1 est converti en octets 01 00 et l'entier court 256 devient les octets 00 01 en petit boutiste. En gros-boutiste, le flux d'octets pour 1 est 00 01 et 256 devient 01 00.

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

pour le code complet voir ici: program to read and store big and little endian