2013-07-22 4 views
0

Octets 240 255 255 9 0 224 9 0C# - bit analyse syntaxique tableau 8 octets

f0 ff ff 09 00 E0 09 00

petit-boutiste unsigned int 64 traduction:

00 09 E0 00 09 ff ff f0

int value1 = 0-19 bits 
int value2 = 20-39 bits 
int value3 = 40-59 bits 
int value4 = 60-62 bits 
bool value5 = 63 bit 

value1 = (uint)(byteArray[0] | byteArray[1] << 8 | (byteArray[2] << 16)) & 0x14; 

Est-ce que je fais cela correctement? Je continue à obtenir la valeur 0, mais doit être 158.

+1

Quelle est l'intention de '& 0x14'? Cela pourrait être votre problème. –

+1

Aussi: pourquoi essayez-vous de stocker 64 bits dans 5 'int's? Pourquoi pas 'byte []' ou 'long' /' ulong'? –

+0

Essayez-vous de stocker la valeur RGBA avec 20 bits par canal (20-20-20-4) ou quelque chose de similaire? 0x14 devrait être d'environ 5 "F" - "0xFFFFF" ... ou vos accolades sont fausses comme le suggère le Moof. –

Répondre

1

La dernière opération dans votre calcul est & 0x14. Cela fera un peu et contre la valeur binaire de 0001 0100. Vous recherchez les 20 premiers bits, votre masque doit donc être 0xfffff.

+0

ouais j'essayais de masquer les 20 bits car il était actuellement de 24 bits. Donc je suppose que 0x14 étant 20 en décimal, il le masquerait. (uint) (byteArray [0] | byteArray [1] << 8 | (byteArray [2] << 16)) & 0xfffff; me donne toujours 2304. – Goss

+0

Basé sur vos règles, le premier nombre serait '0x00900', qui est 2304. –

+0

Gardez à l'esprit que les valeurs de bit sont lues de droite à gauche. En fonction de votre réponse attendue, cela m'amène à croire que les règles sont incorrectes. Ils doivent être Val1 = bits 44-63, Val2 = bits 24-43, etc. En utilisant ces règles avec les octets Little Endian, vous obtiendrez les valeurs attendues. –