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; }
Mais c'est quoi cette mise en page démentielle ?Citation:
Envoyé par seriousme
Regle ton éditeur comme ça :
- remplacer les tabulation par des espaces
- une tabulation = 3 espaces
Petit test unitaire :
Peut mieux faire...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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81 #include <stdio.h> #include <stdlib.h> #include <string.h> 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; } #define N(a) (sizeof(a)/sizeof*(a)) int main() { struct test { int tst; int n; char const *s; }; static struct test const a[] = { { 10, 0, "00000000" }, { 11, 1, "00000001" }, { 12, 0x7F, "01111111" }, { 13, 0x80, "10000000" }, { 14, 0xFF, "11111111" }, { 15, -1, "11111111" }, }; int err = 0; size_t i; for (i = 0; !err && i < N(a); i++) { struct test const *p = a + i; char* s = convert(p->n); if (s != NULL) { if (strcmp (s, p->s) != 0) { printf ("Error at test #%d '%s' / '%s'\n", p->tst, s, p->s); err = 1; } free (s), s = NULL; } } if (!err) { puts("P A S S E D"); } return 0; }
Code:
1
2Error at test #15 '11111111111111111111111111111111' / '11111111'
Ma petite contribution :
Il ya peut etre mieux....Code:
1
2
3
4
5
6
7
8
9 void hex2bin (unsigned int data, char *str, int width) { int i,j; for (i=0, j=width; i<width; i++) str[--j] = (data >> i) & 1 ? '1' : '0' ; str[i] = '\0'; }
Pas besoin d'explication, c'est trivial...;)
Je trouve plus propre d'exagérer le décalage des blocs comme en Python même si il est vrai que ici j'ai mal mit mes accolades.Citation:
Mais c'est quoi cette mise en page démentielle ?
C'est ça que tu veux ?
5 donne "00000000 00000000 00000000 00000101"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
29
30
31
32 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; char *res = malloc(CHAR_BIT * (sizeof(unsigned int))+ sizeof(unsigned int) + 1); char *ptr; // pour compter les bit et mettre les espaces int espace = 0; if (res) { ptr = res; while (n != 0) { val = x & n; if (val == 0) *ptr++ = '0'; else *ptr++ = '1'; n >>= 1; // on ajoute l'espace pour séparer les bytes espace ++; if (espace == CHAR_BIT) { *ptr ++ = ' '; espace = 0; } } *ptr = 0; } return res; }
Je le refais avec un main() :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #include <stdio.h> void hex2bin (unsigned int data, char *str, int width) { int i,j; for (i=0, j=width; i<width; i++) str[--j] = (data >> i) & 1 ? '1' : '0' ; str[i] = '\0'; } int main(void) { char str[16]; hex2bin (0xAA, str, 8); printf("%s\n", str); return 0; }
Emdel va gueuler:code illisible, effet de bord...:mouarf:Citation:
Envoyé par crocodilex
Citation:
Envoyé par crocodilex
Candidat suivant ...Code:
1
2
3 seriousme: Error at test #15 '11111111111111111111111111111111' / '11111111' crocodilex: Error at test #10 '00' / '00000000'
Ah, radix, c'est la largeur... fallait le dire.. Pour moi, c'est la base, alors j'ai mis 2 !
Avec 8 :
Mais il faut remplacer 'radix' par 'width', ce sera plus clair. Le code doit être 'auto-documenté'.Code:
1
2
3seriousme: Error at test #15 '11111111111111111111111111111111' / '11111111' crocodilex: P A S S E D
Ouf j'ai eu peur :PCitation:
Envoyé par Emmanuel Delahaye
En effet width et plus causant que radix...
Je corrige tout de suite.
Citation:
Envoyé par Trap D
Code:
1
2
3
4 seriousme: Error at test #15 '11111111111111111111111111111111' / '11111111' crocodilex: P A S S E D Trap D: Error at test #10 '00000000 00000000 00000000 00000000 ' / '00000000'
Je n'avais pas lu ton mesage...Citation:
Envoyé par seriousme
Tu parles de quel effet de bord ? Quelque chose m'a échappé ? Dis moi où, que je corrige ça tout de suite.
Pour le code illisible, tu fais certainement allusion à l'opérateur ternaire....Oui, je sais, beaucoup de developpeurs n'aiment pas cette écriture, mais moi j'aime bien. Désolé...
Ta fonction n'a pas d'information de taille. Elle peut donc écrire hors des limites du tableau de char ...Citation:
Envoyé par crocodilex
J'ajouterais une information 'taille'
Emmanuel, c'est quoi ton test ?????
Quelle est mon erreur ?
Non conformité avec la spec (format 8 bits)Citation:
Envoyé par Trap D
Ignorer ce qui est au-dessus du trait...
Code:/* --- ... ----------- */
Merci pour l'info. Ci-joint une version légèrement améliorée suite à cette remarque :Citation:
Envoyé par Emmanuel Delahaye
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 #include <stdio.h> #define STRSIZE 16 /* **============================================================================= ** hex2bin : Convert data into binary format **============================================================================= ** Output : ** - str : string containing data conversion into binary format ** Input : ** - data : data to be converted ** - width : binary format width ** - strSize : str max size ** Return values : ** If successful, hex2bin returns 1. If there is an error (string size ** error), hex2bin returns 0. **============================================================================= */ int hex2bin (unsigned int data, char *str, size_t strSize, unsigned char width) { int i, j, res=1; if (width < strSize) { for (i=0, j=width; i<width; i++) str[--j] = (data >> i) & 1 ? '1' : '0' ; str[i] = '\0'; } else res = 0; return res; } int main(void) { char str[STRSIZE]; if ( !hex2bin(0xAA, str, STRSIZE, 8) ) printf("String size error\n"); else printf("%s\n", str); return 0; }
Et la place pour le 0 ?Citation:
Envoyé par crocodilex
Code:if (width < strSize - 1) {
Il faut comparer ce qui est comparable, je n'ai jamais prétendu traduire un char mais un unsigned int, c'est différent, donc ce test n'est pas valable.:mouarf:
La condition (width < strSize) en tient compte, à moins que j'ai loupé quelque chose !!!Citation:
Envoyé par Emmanuel Delahaye
Exact. Je suis fatigué. Vivement mardi que je reprenne le boulot !Citation:
Envoyé par crocodilex
Si vous savez comment introduire du code assembleur dans un programme C, je peux vous donnez le script assembleur qui fait ça. C'est plus cours, plus rapide en temps d'execution et aussi efficace.
Personnellement je n'ai pas essayé d'incorporer un script assembleur avec le langage C. J'ai deja vu un programme pascal incorporant un script assembleur.