Bonjour,
je voudrais convertir un "uint32_t uuid128[4]" en "uint8_t uuid[16]", comment m'y prendre ?
Merci.
Bonjour,
je voudrais convertir un "uint32_t uuid128[4]" en "uint8_t uuid[16]", comment m'y prendre ?
Merci.
Bonjour
Exactement de la même façon que de convertir un "uint32_t x" en "uint8_t y[4]". Tu réfléchis à ce que ça représente pour toi, puis tu codes l'opération, et enfin tu l'appliques sur les 4 valeurs de ton tableau d'origine.
Si c'est juste une bête copie des 32 bits de la variable d'origine dans chacun des 8 bits de la variable de destination, alors une simple "union" fera le job
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 typedef union { uint_32t x; uint_8_t y[4]; } t_convert; t_convert c; // Copier la valeur dans c.x et la récupérer depuis c.y
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Merci pout ton aide, mais peux-tu détailler la suite du code ?
Non. Ici ce n'est pas "allo pizzacode, je voudrais un code gratos". Tu veux de l'aide parce que tu as écris un code qui pose souci on t'aidera en te disant ce qui ne va pas et/ou éventuellement comment l'optimiser. Mais "aider" ce n'est pas faire les choses à ta place.
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
quelque chose comme ça ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 typedef union { uint_32t x; uint_8_t y[4]; } t_convert; t_convert c; c.x = uuid128; uint8_t uuid[16] = c.y;
C'est quoi "uuid128" ? C'est une valeur ? Parce que quand on écrit "var=x" ça sous-entend que "x" est soit une valeur, soit une variable contenant une valeur !!!
Euh non. c.y correspond à c.x mais codé différemment. C'est donc "un" uuid128.
Quel mot tu n'as pas compris dans "puis tu codes l'opération, et enfin tu l'appliques sur les 4 valeurs de ton tableau d'origine." ??? Parce que copier un xxx[4] dans un yyy[16] c'est faire 4 fois "copier un n dans un yyy[4]" quoi...
Si tu débutes en C fallait déjà le dire et surtout aller dans la section "débutants" !!!
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
laisse tomber je chercherai de l'aide ailleurs, je ne suis pas un spécialiste en C.
ce code peut-il fonctionner ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 uint32_t uuid128[4] = <some 32 bit signed or unsigned int>; int8_t uuid[16] = { 0 }; for( int i = 0; i < 4; i++ ) { uuid[i*4] = (int8_t)(uuid128[i]>>24); uuid[i*4+1] = (int8_t)(uuid128[i]>>16); uuid[i*4+2] = (int8_t)(uuid128[i]>>8); uuid[i*4+3] = (int8_t)(uuid128[i]); }
Est-ce qu'union fonctionne comme cela ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 typedef union { uint32_t x; uint8_t y[4]; } t_convert; t_convert c1; t_convert c2; t_convert c3; t_convert c4; uint32_t uuid128[4] = <some 32 bit signed or unsigned int>; c1.x = uuid128[0]; c2.x = uuid128[1]; c3.x = uuid128[2]; c4.x = uuid128[3]; uint8_t uuid[16] = { c1.y[0], c1.y[1], c1.y[2], c1.y[3], c2.y[0], c2.y[1], c2.y[2], c2.y[3], c3.y[0], c3.y[1], c3.y[2], c3.y[3], c4.y[0], c4.y[1], c4.y[2], c4.y[3] };
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
ce qui est bizarre, c'est que
n'affiche pas la même valeur, est-ce normal ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 cout<<uuid128; cout<<uuid;
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Penses-tu que ce code ne risque pas de poser de problème d'endianess ?
En C il y a deux types de problèmes
- les problèmes de UB (un code correct mais incorrectement utilisé comme par exemple remplir une zone pointée sans maîtriser le pointeur).
- les problèmes de logique (mettre un carré dans un rond et espérer que ça reste un carré)
Les soucis UB c'est gérable. Avec un peu d'acharnement on trouve l'erreur et on corrige. Les soucis de logique eux ne le sont pas. Si je copie 500 dans un char, j'obtiens 244. Ce n'est pas une erreur du C, c'est une erreur de ma propre conception (oublier qu'un char ce n'est que 8 bits et que le nombre 500 ça en prend 9).
Toi tu veux copier des bits dans des zones. La copie en elle-même ne posera aucun souci. Mais est-ce que cette copie a un sens... seul toi a la réponse.
Exemple plus parlant
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #include <stdio.h> typedef union { long i; float f; } t_xxx; int main() { t_xxx xxx; xxx.i=847512; printf("i=%ld, f=%f, hex=%08lx\n", xxx.i, xxx.f, xxx.i); xxx.f=847512; printf("i=%ld, f=%f, hex=%08lx\n", xxx.i, xxx.f, xxx.i); }
Compile et exécute et tu comprendras l'idée. Même si un long et un float font tous deux 32 bits, le codage interne de ces bits n'est pas le même dans l'un que dans l'autre...
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
J'ai testé sur Ubuntu pour un client Bluetooth RFCOMM, j'ai besoin de l'UUID pour me connecter à un serveur RFCOMM sous Windows, ça fonctionne nickel, ça n'a pas l'air de poser de problème.
Je n'ai jamais dit que ça en poserait (surtout que c'est la première fois que tu expliques le but de l'opération). J'ai juste dit que c'était à toi de savoir ce que tu fais.
Ceci dit, le uuid c'est peut-être du nombre mais c'est avant tout une chaine (chaine de chiffres certes mais chaine). Tu n'aurais donc pas eu avantage à passer par du char[]? Je veux transférer 123456 en environnements hétérogènes ben j'écris la chaine "123456" (sprintf) et c'est la chaine que je transfère. Et de l'autre côté je reconvertis "123456" en nombre 123456 (sscanf).
Au moins tu n'as plus à t'inquiéter de l'endianness de tes chiffres...
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Partager