2010-03-15 2 views

Répondre

4

Stockage

unsigned short get_header(unsigned char type, unsigned short length) 
{ 
    return (static_cast<unsigned short>(type) << 12) | length;  
} 

Récupération (de unsigned short)

unsigned short header = /* get 2 header bytes */ 
unsigned char type = header >> 12; 
unsigned short length = header & 0xFFF; 

Récupération (de unsigned char [2])

unsigned char bytes[2] = /* get 2 header bytes */ 
unsigned char type = bytes[0] >> 4; 
unsigned short length = bytes[0] & 0xF | bytes[1]; 
+0

J'utiliserais un short non signé pour éviter les problèmes de l'extension de signe. –

+0

Bon point, va changer maintenant. –

+2

Vous pouvez utiliser ((octets [0] & 0x0f) << 8) | octets [1] :) – rsp

1

Vous devez utiliser l'opération numérique ET et le décalage vers la droite pour extraire les valeurs.

Your header:  TTTTLLLLLLLLLLLL 
Mask for type: 1111000000000000 = 0xF000 
Mask for length: 0000111111111111 = 0x0FFF 

Extraction:

// Just an example, this is 0001001000110100 in binary 
uint16_t exampleHeader = 0x1234; 

// Mask out the length and shift type to the right to get 0001 (binary) 
uint8_t type = (exampleHeader & 0xF000) >> 12; 

// Same here but no shift needed, returns 001000110100 (binary) 
uint16_t length = exampleHeader & 0x0FFF; 

Assemblage d'un en-tête:

uint16_t header = (type << 12) | length; 

Vous pouvez remplacer les types entiers (uintXX_t) avec le type correspondant de votre langue, comme unsigned long. Le code doit être le même pour Java et C++, à l'exception des mots-clés de type.

0

sur le c/C++ taille atleast, vous pouvez simplement utiliser cette structure: ne sais pas si vous pouvez le faire dans tho java ...

struct Header{ 
    unsigned short 
     type: 4 
     length: 12 
     ; 
}; 

note, ceux qui pourraient devoir être commutées aussi, vous pourriez avoir des problèmes d'endian, endian dépend du type de processeur au type de processeur (tous les processeurs amd et intel que je connais sont les mêmes, les seuls que je connaisse qui sont différents sont ceux de PowerPC je pense , le plus notablement utilisé dans la PS3 et la Xbox 360)

Questions connexes