Bonjour,
Je suis a la recherche d'une fonction en C qui permette de transformer un entier en octer. Un truc du genre :
char * IntToOctet (int entier)
Est ce que quelqu'un a deja fait ca?
merci
Version imprimable
Bonjour,
Je suis a la recherche d'une fonction en C qui permette de transformer un entier en octer. Un truc du genre :
char * IntToOctet (int entier)
Est ce que quelqu'un a deja fait ca?
merci
Il faut travailler avec les opérateurs bitwise.
Montre...Citation:
Envoyé par seriousme
C'est un défi?8-)Citation:
Envoyé par Emmanuel Delahaye
Il faut juste faire gaffe à la taille des entiers utilisés avec "sizeof".
Un octet est un objet d'exactement 8 bits. J'ai du mal à saisir ce que tu veux faire exactement.Citation:
Envoyé par personne64
On peut faire ça :
qui mets le bits de poids fort à 0 et laisse les 8 bits de poids faibles intacts... mais je ne suis pas sûr que ce soit ça que tu veuilles...Code:unsigned int x = 1234 & 0xFF;
Ca m'interesse de savoir ce que tu as compris de la question, parce que pour moi, c'est flou...Citation:
Envoyé par seriousme
Je pense qu'il veut afficherCitation:
Envoyé par Emmanuel Delahaye
au lieu de 170.Code:10101010
Peut être...Citation:
Envoyé par seriousme
Pas astucieux, pas optimisé mais l'idée est là.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 void convert(int n){ int binaire[32]={0}; int i=0; int mask=1; int a; for(i=0;i<32;i++){ a=0; if((n&mask)==mask){ a=1; } binaire[i]=a; mask=mask<<1; } for(i=31;i>=0;i--){ printf("%d",binaire[i]); } }
L'interface du P.O. étaitCitation:
Envoyé par seriousme
Code:char * IntToOctet (int entier)
Un programme qui
par exemple pour 3 donne 00000011
je test le code , merci
No problem:Citation:
Envoyé par Emmanuel Delahaye
et:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 char* convert(int n){ char *binaire=calloc(33,sizeof(char)); int i=0; int mask=1; char a; for(i=0;i<32;i++){ a='0'; if((n&mask)==mask){ a='1'; } binaire[31-i]=a; mask=(mask<<1); } binaire[32]=0; return binaire; }
Code:
1
2 char *s=convert(3640); printf("%s",s);
Ah, il fait être plus précis.Citation:
Envoyé par personne64
Tu veux, à partir de la valeur d'un entier, produire une chaine représentanat celle-ci sous forme binaire sur une largeur de 8 bits.
- L'entier doit être non signé.
- La valeur doit être comprise entre 0 et 255
- Il est souhaitable de fournir à la fonction l'adresse et la taille d'un tableau de char.
La fonction retourne 0 si tout c'est bien passé ou 1 en cas d'erreur :Code:
1
2 int integer2bin (char *s_out, size_t size, unsigned int value);
- Adresse de s_out valant 0.
- Taille de s_out < 9.
- Valeur de value > 255
C'est bon j'ai édité.
Ca marche mais je ne comprend pas pourquoi l'autre buggait.
Je m'étais amusé à faire ça sur un autre forum
Le programme n'écrit pas les 0 "inutiles", si il faut les écrire il suffit d'enlever le flag.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 char *binaire2(unsigned int x) { unsigned int n = 1 << CHAR_BIT * (sizeof(unsigned int)) - 1; // pour être plus portable (include <limits.h>) unsigned int val; int flag = 0; char *res = malloc(CHAR_BIT * (sizeof(unsigned int))+ 1); char *ptr; if (res) { ptr = res; while (n != 0) { val = x & n; if (flag == 1 && val == 0) *ptr++ = '0'; else if (val) { *ptr++ = '1'; flag = 1; } n >>= 1; } *ptr = 0; } return res; }
Le souci c'est qu'il ne formate pas sous forme d'octet:Citation:
Le programme n'écrit pas les 0 "inutiles"
avec 70 on obtient 1000110, 01000110 est plus "propre".
D'où ma remarque sur le fait qu'il suffit de supprimer le flag :mouarf:
D'autre part je travaille sur des unsigned int pas des char !
Mais sans le flag il y a des zéros en trop, comme avec la mienne.
8O
Je n'ai pas suivi toute la discussion, mais là, j'avoue que je ne comprends rien, il y a des 0 en trop ou pas, que veux-tu exactement ?
Petit rappel ma fonction est faite pour des unsigned int, pas des char !
Voila là c'est un formatage octet par octet:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 char* convert(int n){ char *binaire=calloc(33,sizeof(char)); int i=0; int mask=1; char a; for(i=0;i<32;i++){ a='0'; if((n&mask)==mask){ a='1'; } binaire[31-i]=a; mask=(mask<<1); } char *bin=strchr(binaire,'1'); binaire=bin-(bin-binaire)%8; return binaire; }