OVH Cloud OVH Cloud

Extraire des bits d'un tableau d'octets

3 réponses
Avatar
Cyber Sinh
Bonjour,
Après quelques heures de prise de tête, je me décide à demander demander
de l'aide. Voici mon problème:

Je dispose d'un tableau de 8 octets (soit 64 bits). Je dois extraire les
20 premiers bits qui doivent me fournir un integer, les 3 bits suivants
qui doivent me fournir un un byte, les 5 bits suivants qui doivent me
fournir un byte et enfin, les 36 dernier bits qui doivent me fournir un0
long.

L'utilisation de la classe BitArray ne m'a pas permis d'arriver à mes
fins ! Voici mon tableau :

byte[] buffer =3D new byte[8] {0x17, 0x70, 0x03, 0x70, 0x01, 0x53, 0x8F,
0x76 };

//résultat attendu pour les 20 premiers bits = 96000
// pour les 3 suivants = 1
// pour les 5 suivants = 23
// j'arrive à trouver ces résultat avec la calculatrice Windows mais pas
en C#

Merci pour votre aide... Si quelqu'un pouvait me poster un exemple de
code qui permettrait de retrouver ces résulats, ce serait super cool !

Cyber Sinh

3 réponses

Avatar
Whiplash
Salut,

Pourquoi t'embêter avec des objets compliqués pour si peu de bits à traiter ?

byte[] wTab = new byte[] {0x17, 0x70, 0x03, 0x70, 0x01, 0x53, 0x8F, 0x76} ;

Int32 wInt32 = wTab[0] ;
wInt32 = (wInt32 << 8) | wTab[1] ;
wInt32 = (wInt32 << 4) | ((wTab[2] >> 4) & 0x0F) ;
Console.WriteLine(wInt32.ToString("X08")) ;

Byte wByte3 = Convert.ToByte((wTab[2] >> 1) & 0x07) ;
Console.WriteLine(wByte3.ToString("X02")) ;

Byte wByte5 = Convert.ToByte(((wTab[2] & 0x01) << 4) | ((wTab[3] >> 4) & 0x0F)) ;
Console.WriteLine(wByte5.ToString("X02")) ;

Int64 wInt64 = (wTab[3] & 0x0F) ;
wInt64 = (wInt64 << 8) | wTab[4] ;
wInt64 = (wInt64 << 8) | wTab[5] ;
wInt64 = (wInt64 << 8) | wTab[6] ;
wInt64 = (wInt64 << 8) | wTab[7] ;
Console.WriteLine(wInt64.ToString("X16")) ;

@+


"Cyber Sinh" a écrit dans le message de news:4265b0f6$0$2099$
Bonjour,
Après quelques heures de prise de tête, je me décide à demander demander
de l'aide. Voici mon problème:

Je dispose d'un tableau de 8 octets (soit 64 bits). Je dois extraire les
20 premiers bits qui doivent me fournir un integer, les 3 bits suivants
qui doivent me fournir un un byte, les 5 bits suivants qui doivent me
fournir un byte et enfin, les 36 dernier bits qui doivent me fournir un0
long.

L'utilisation de la classe BitArray ne m'a pas permis d'arriver à mes
fins ! Voici mon tableau :

byte[] buffer = new byte[8] {0x17, 0x70, 0x03, 0x70, 0x01, 0x53, 0x8F,
0x76 };

//résultat attendu pour les 20 premiers bits = 96000
// pour les 3 suivants = 1
// pour les 5 suivants = 23
// j'arrive à trouver ces résultat avec la calculatrice Windows mais pas
en C#

Merci pour votre aide... Si quelqu'un pouvait me poster un exemple de
code qui permettrait de retrouver ces résulats, ce serait super cool !

Cyber Sinh


Avatar
Cyber Sinh
Whiplash a écrit :
Salut,

Pourquoi t'embêter avec des objets compliqués pour si peu de bits à traiter ?

byte[] wTab = new byte[] {0x17, 0x70, 0x03, 0x70, 0x01, 0x53, 0x8F, 0x76} ;

Int32 wInt32 = wTab[0] ;
wInt32 = (wInt32 << 8) | wTab[1] ;
wInt32 = (wInt32 << 4) | ((wTab[2] >> 4) & 0x0F) ;
Console.WriteLine(wInt32.ToString("X08")) ;

Byte wByte3 = Convert.ToByte((wTab[2] >> 1) & 0x07) ;
Console.WriteLine(wByte3.ToString("X02")) ;

Byte wByte5 = Convert.ToByte(((wTab[2] & 0x01) << 4) | ((wTab[3] >> 4) & 0x0F)) ;
Console.WriteLine(wByte5.ToString("X02")) ;

Int64 wInt64 = (wTab[3] & 0x0F) ;
wInt64 = (wInt64 << 8) | wTab[4] ;
wInt64 = (wInt64 << 8) | wTab[5] ;
wInt64 = (wInt64 << 8) | wTab[6] ;
wInt64 = (wInt64 << 8) | wTab[7] ;
Console.WriteLine(wInt64.ToString("X16")) ;

@+


"Cyber Sinh" a écrit dans le message de news:4265b0f6$0$2099$

Bonjour,
Après quelques heures de prise de tête, je me décide à demander demander
de l'aide. Voici mon problème:

Je dispose d'un tableau de 8 octets (soit 64 bits). Je dois extraire les
20 premiers bits qui doivent me fournir un integer, les 3 bits suivants
qui doivent me fournir un un byte, les 5 bits suivants qui doivent me
fournir un byte et enfin, les 36 dernier bits qui doivent me fournir un0
long.

L'utilisation de la classe BitArray ne m'a pas permis d'arriver à mes
fins ! Voici mon tableau :

byte[] buffer = new byte[8] {0x17, 0x70, 0x03, 0x70, 0x01, 0x53, 0x8F,
0x76 };

//résultat attendu pour les 20 premiers bits = 96000
// pour les 3 suivants = 1
// pour les 5 suivants = 23
// j'arrive à trouver ces résultat avec la calculatrice Windows mais pas
en C#

Merci pour votre aide... Si quelqu'un pouvait me poster un exemple de
code qui permettrait de retrouver ces résulats, ce serait super cool !

Cyber Sinh







Merci beaucoup, c'est exactement ce que je recherchais !
Mais je dois avouer que j'ai un peu de mal avec la combinaison des
opérateurs sur les bits...

A bientôt et merci encore pour votre aide

Cyber Sinh
Avatar
Whiplash
bop, de rien :-)
y'a peut-être une solution plus esthétique hein...

"Cyber Sinh" a écrit dans le message de news:4266340b$0$14207$
Merci beaucoup, c'est exactement ce que je recherchais !
Mais je dois avouer que j'ai un peu de mal avec la combinaison des
opérateurs sur les bits...

A bientôt et merci encore pour votre aide

Cyber Sinh