Binary II

cs_helena123 Messages postés 22 Date d'inscription mardi 4 mars 2003 Statut Membre Dernière intervention 25 août 2003 - 29 juil. 2003 à 11:47
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 - 29 juil. 2003 à 15:29
Salut les loulous,
je vous remercie deja pour les conseils sur la declaration de champs de bits mais maintenant j ai un probleme de manipulation plus delicat, vous pouvez encore m aider sivouplait ... je veux juste envoyer sur un fichier un paquet de 14 bits et puis le lire pour etre sur qu il est bien arrive ...

voici donc ma declaration :

#include <conio.h>
#include <fstream.h>

int main(int argc, char* argv[])
{

typedef struct Packet_ID // definition du champs de bits
{
unsigned Version_1 :1;
unsigned Version_2 :1;
unsigned Version_3 :1;
unsigned Type :1;
unsigned Flag :1;
unsigned Process_ID1 :1;
unsigned Process_ID2 :1;
unsigned Process_ID3 :1;
unsigned Process_ID4 :1;
unsigned Process_ID5 :1;
unsigned Process_ID6 :1;
unsigned Process_ID7 :1;
unsigned Process_ID8 :1;
unsigned Process_ID9 :1;

} Packet_ID ; // 14 Bits

Packet_ID Packet001 ;
Packet001.Version_1 = 0 ;
Packet001.Version_2 = 0 ;
Packet001.Version_3 = 0 ;
Packet001.Type = 0 ;
Packet001.Flag = 1 ;
Packet001.Process_ID1 = 1 ;
Packet001.Process_ID2 = 0 ;
Packet001.Process_ID3 = 1 ;
Packet001.Process_ID4 = 1 ;
Packet001.Process_ID5 = 0 ;
Packet001.Process_ID6 = 1 ;
Packet001.Process_ID7 = 1 ;
Packet001.Process_ID8 = 1 ;
Packet001.Process_ID9 = 0 ;


// envoyer

ofstream outfile("names.dat", ios::binary);
outfile.write((char*)&Packet001, sizeof(Packet_ID));

// lire

ifstream infile ("names.dat",ios::binary);
if (!infile) return 0 ;
Packet_ID Packet002 ;
infile.read((char*)&Packet002,sizeof(Packet_ID));
cout << ((char*)&Packet002) ;
getch();
return 0;
}

et quand je lance ca, il me mets sur la console 0000 et 2 signes bizarres ...

je suis a nouveau perdue ...
BisouXXX

6 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
29 juil. 2003 à 12:00
On ecrit et ne lit QUE des octets (multi de 8 bits) !!!
Par contre on peut manipuler les bits.
BruNews, ciao...
0
cs_helena123 Messages postés 22 Date d'inscription mardi 4 mars 2003 Statut Membre Dernière intervention 25 août 2003
29 juil. 2003 à 12:09
merci bcp !!!
ton programme etait en asm et j ai juste pu m en inspirer...
BisouXXX
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
29 juil. 2003 à 14:04
Pourquoi ne pas utiliser un int16
puis apres tu lui applique des & des | des ! etc ...
avec des flags
par exemple :
si le num de ta version est en b10-b11-b12
soit v le num de la verion
n le nombre qui contient toutes les infos

//vaut en binaire 0001 1100 0000 0000
#define FLAG_VERSION (0x1C00)
v &= 7; // modulo 8, car 0 <= v <=7
v <<= 9; // on decale pour s'aligne sur b10-b11-b12
n &= (!(FLAG_VERSION)); //on met a 0 : b10-b11-b12
n |= v; // on ecrit le num de la version

voila !
je ne sait pas si tout ceci est juste, mais ca y ressemble.
C'est en faite la fonction ChangeVersion(int n,int v);

Je propose cette facon, car avec la structure,
je ne pense pas que l'on puisse faire ceci :

Packet001.Version_1 = v;

???

:-p :-p :-p :) :-p :-p :) :-p :-p :)
:) :-p :) :) :-p :) :) :-p :) :-p
:) :-p :) :) :-p :) :) :-p :) :-p
:-p :-p :) :) :-p :-p :) :-p :-p :)
0
cs_helena123 Messages postés 22 Date d'inscription mardi 4 mars 2003 Statut Membre Dernière intervention 25 août 2003
29 juil. 2003 à 14:12
moi je veux bien tout ce que tu veux mais je ne comprends pas tout, par exemple , ca veut dire quoi : 0x1C00 ...
tu connais un site ou ils expliquent un peu la manipulation de bits car tous les trucs que je trouve c est des int, des char ou des bytes mais jamais bit a bit ... merci d avance
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
29 juil. 2003 à 15:26
Et bien, 0x1C00 est un nombre,
ici il est ecrit en hexadecimal car il a le prefixe 0x
En binaire il s'ecrit : 0001 1100 0000 0000
je de l'ecrit 4 bits par 4 bit
j'ai supposer que le num de la version etait en b10-b11-b12

n° : n ! FLAG_VERSION &
------------------------------------------------------
b00 : ? 1 ?
b01 : ? 1 ?
b02 : ? 1 ?
b03 : ? 1 ?
b04 : ? 1 ?
b05 : ? 1 ?
b06 : ? 1 ?
b07 : ? 1 ?
b08 : ? 1 ?
b09 : ? 1 ?
b10 : version#1 0 0
b11 : version#2 0 0
b12 : version#3 0 0
b13 : ? 1 ?
b14 : ? 1 ?
b15 : ? 1 ?

donc quand on fait !a
on inverse tous le bit de a : 1->0 et 0->1
on remarque que dans la 3eme colonne :
tout les bits SAUF b10-b11-b12
se rester. Les bits b10-b11-b12 sont mis a zero

On suppose que la version soit 5, i.e. 101 en, binaire
on a ???0 00?? ???? ????
et l'on veut que se soit
???1 01?? ???? ????
donc s'il l'on fais l'operation OU
de ???0 00?? ???? ????
avec 0001 0100 0000 0000
on a:----------------------------
_____ ???1 01?? ???? ????
c'est ce que l'on cherchais !!!
Pour avoir 0001 010 0000 0000
on prend 0000 0000 0000 0101
et on decale 9 fois ver la gauche (noté <<9)
0000 0000 0000 0101 (<<0)
0000 0000 0000 1010 (<<1)
0000 0000 0001 0100 (<<2)
0000 0000 0010 1000 (<<3)
...
0001 0100 0000 0000 (<<9)

Ainsi on arrive a mettre le nouveau numero de la version
sans changer les autres bits !
On fais de-meme (avec qq modif) pour l'ID,le flag, et le type

:-p :-p :-p :shy) :-p :-p :-p :shy) :-p :-p :shy)
:shy) :-p :shy) :shy) :-p :shy) :-p :shy) :-p :shy) :-p
:shy) :-p :shy) :shy) :-p :shy) :-p :shy) :-p :shy) :-p
:-p :-p :shy) :shy) :-p :-p :-p :shy) :-p :-p :shy)
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
29 juil. 2003 à 15:29
exuse le tableau n'est pas passer a cause des blancs !
le premier colone est le num du bit, la seconde n, la 3eme le FLAG_VERSION dont on a inverser les bit, et la dernier colonne
et resultat de l'operation ET

:-p :-p :-p :shy) :-p :-p :-p :shy) :-p :-p :shy)
:shy) :-p :shy) :shy) :-p :shy) :shy) :shy) :-p :shy) :-p
:shy) :-p :shy) :shy) :-p :shy) :shy) :shy) :-p :shy) :-p
:-p :-p :shy) :shy) :-p :-p :-p :shy) :-p :-p :shy)
0
Rejoignez-nous