Récupérations de valeurs dans chaîne de caractères

Fermé
vivitare Messages postés 109 Date d'inscription mercredi 21 mai 2014 Statut Membre Dernière intervention 23 août 2018 - Modifié le 12 juin 2018 à 14:17
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 14 juin 2018 à 13:25
Bonjour,

J'aimerai en c++ récupérer et stocker des valeurs hexadécimales depuis chaîne de caractères dans un tableau.

Exemple :

j'ai une variable de type char lecture[]="A610" , et je voudrai récupérer les valeurs sous la forme char adresse[0]=0xA6 et adresse[1]=0x10 .

Si des informations supplémentaires sont nécessaires, je répondrai dans les plus bref délais.
A voir également:

1 réponse

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 13 juin 2018 à 14:16
Salut vivitare,

Je ne vois pas trop ce que tu voudrais en faire, mais pour faire ce que tu dis, en C, on peut faire comme cela par exemple :

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char lecture[] = "A610";
    unsigned char adresse[2];

    long val = strtol(lecture, NULL, 16);
    adresse[0] = (val >> (8*1)) & 0xFF;
    adresse[1] = (val >> (8*0)) & 0xFF;

    printf("val adresse[0] = 0x%02X\n", adresse[0]);
    printf("val adresse[1] = 0x%02X\n", adresse[1]);

    return 0;
}

donne compilé et exécuté :

$ gcc -Wall 35414647.c
$ ./a.out 
val adresse[0] = 0XA6
val adresse[1] = 0X10
$

Il faut que ton tableau adresse soit un tableau de char non signés, sinon les valeurs dépassant 127 ne pourront pas être valablement stockées.

Dal
0
vivitare Messages postés 109 Date d'inscription mercredi 21 mai 2014 Statut Membre Dernière intervention 23 août 2018
Modifié le 13 juin 2018 à 23:57
C'était pour lire une chaîne de caractère sur une BDD et la convertir en HEX. Mais j'ai trouvé la solution avec ceci :
char lecture[]="10604F38CDA5";
char adresse[6];
 
sscanf(lecture, "%2x%2x%2x%2x%2x%2x", &adresse[0], &adresse[1],&adresse[2],
       &adresse[3],&adresse[4],&adresse[5]) ;
 
for(int i=0;i<6;i++)
{
    printf("%2X ", (unsigned char)adresse[i]);
}


ce qui me donne cela :


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 14 juin 2018 à 13:27
oui, on peut aussi faire comme cela.

Je m'interrogeais sur ce que que tu voulais faire, et l'usage de l'équivalent de la représentation textuelle sous forme d'octets.

Là, ton souhait est juste qu'ils soient organisés dans le même ordre que l'ordre de lecture de la chaîne de caractère issue de la base de donnée, sans autres précisions, et c'est ce que fait ton code et le mien.

Comme tu le sais peut-être (mais tu n'évoques pas ce point, alors je te le signale), selon ce que représente la source de données et l'usage que tu feras de ton tableau d'octets, l'ordre devrait peut être adapté.

Par exemple, si les octets 0x10604F38 représentent la valeur d'un entier sur 32 bits, il sera effectivement stocké en mémoire dans cet ordre 10 60 4F 38 sur les systèmes Big Endian.

Par contre, il sera stocké :
- 38 4F 60 10 sur les systèmes Little Endian
- 60 10 38 4F sur les systèmes Mid-Big Endian
- 4F 38 10 60 sur les systèmes Mid-Little Endian

si ce sont des entiers sur 16 bits, cela sera encore différent, si tu veux échanger ces octets au travers d'un réseau, etc.

donc, à moins de savoir ce que représente la chaîne de caractère issue de la base de donnée, et savoir ce que tu veux en faire et sur quel type de système, il est impossible de dire si la représentation en mémoire que tu construis est pertinente ou pas :-)

Dal
0