Problème conversion String , DEC > ,HEX

Bonjour, je suis débutant en programmation, je cherche le moyen de convertir une String.
Voici le code

void dump_byte_array(byte *buffer, byte bufferSize) {
  
  String Uid;                                  
    
    for (byte i = 0; i < bufferSize; i++) {
       // Serial.print(buffer[i] < 0x10 ? " 0" : " ");
        Serial.print(buffer[i], HEX);  
  
        Uid += (buffer[i]);                 
    }

    
    Serial.println();                            
    Serial.print(Uid);                           
    Serial.println();

Voilà ce que j’obtiens

11172B61 
17234397

OK une fois en HEX et une en DEC

moi J’aimerais les deux en HEX

Uid += (buffer[i],HEX);

et là :’(

11172B61 
16161616     //???????????

Ou est mon erreur ?

Pour moi, la solution est bien dans cette ligne de code

Uid += (buffer[i],HEX);

J'ai essayé plusieurs pleins d'autres choses et syntaxe, mais rien y fait suis-je sur la bonne voie ou esse tout simplement impossible :confused:

si tu veux convertir quelque chose en chaine de caractères, tu peux passer par sscanf :

sscanf (variableDest,"%X",&variableAConvertir);

Non ma chaîne de caractère est faite dans ma boucle for, mais au format DEC et moi, j'aimerais l'avoir au format HEX

oui mais il faut convertir ton buffer[ i ] aussi. Et (buffer[ i ],HEX), ça ne veut rien dire en dehors d'une fonction.

Ton besoin n'est pas très claire. Est-ce un simple problème d'affichage? Ou de conversion d'une chaîne contenant une valeur hexa?

Ok désolé, mais ce que j’aie pu trouver sur cette fonction mon fait pensé quelle remplaçait le String

Bon, cet parti, je fais fumer ce qui me reste de cerveau :sweat_smile:

sscanf (buffer_)[/b] pour le point d’extractions**,"%p"** présentée sous forme hexadécimale **,&Uid;**comme en sortie de l’appel_
Voilà ce que j’en ai compris mai la surprise sa compile pas :smiling_imp:

Ce que je voudrais par la suite, c'est pouvoir comparé ces valeurs l'une étant dans un fichier l'autre dans une (String) par ex.

C'est pas %p pour l'hexa mais %X ou %x. %p est reservé pour les pointeurs.

Pourquoi tu sors les paramêtres de la fonction ? Je te donne ça : sscanf (variableDest,"%X",&variableAConvertir); et tu le transformes en sscanf (buffer) , je ne sais pas où t'as mis le reste.

Redonne le code de ta fonction entière et la façon dont tu la testes

Par contre j'ai fait une grosse boulette, c'est sprintf et pas scanf !

Désoler, je suis vraiment débutant

#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN		3		// 
#define SS_PIN		4		//

MFRC522 mfrc522(SS_PIN, RST_PIN);	



void setup() {
	Serial.begin(9600);		
	while (!Serial);		
	SPI.begin();			
	mfrc522.PCD_Init();		

	Serial.println(F("Scannez un tag Mifare pour voir L' UID,"));
}

void loop() {
	
	if ( ! mfrc522.PICC_IsNewCardPresent()) {
		return;
	}

	
	if ( ! mfrc522.PICC_ReadCardSerial()) {
		return;
	}

	dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);

        delay(500);
}



void dump_byte_array(byte *buffer, byte bufferSize) {
  
  String Uid;                                  /
    
    for (byte i = 0; i < bufferSize; i++) {

        Serial.print(buffer[i], HEX);  
  
        //Uid += (buffer[i]);                
        
        sscanf (buffer[i],"%X",&uid);
    }
    Serial.print(";    Reference par Def.!");
    
    Serial.println();                            
    Serial.print(Uid);                           
    Serial.println(); 
    Serial.print("");
    Serial.println();                             
}

fdufnews te demandais si tu voulais juste afficher, ou as tu besoin de récupérer cette chaine ailleurs ?
Car si c’est que de l’affichage, réorganiser tes quelques lignes de départ suffisait.

Après vu que tu cherches à comparer, et qu’un des comparé sera sous forme de chaine, pour convertir on a ça :

void byte2str(byte buf[], int taille, char str[])
{
    const char * hex = "0123456789ABCDEF";

    int i = 0;
    for(i = 0; i < taille-1; ++i){
        *str++ = hex[(*buf>>4)&0xF];
        *str++ = hex[(*buf++)&0xF];
        *str++ = ':';
    }
    *str++ = hex[(*buf>>4)&0xF];
    *str++ = hex[(*buf)&0xF];
    *str = 0;
}

On utilise comme ça :

byte buf[] = {0, 1, 4, 5, 255};
char str[50]; //la chaine de destination. attention, prévoir assez de caractères, sinon débordement.
byte2Str(buf, sizeof(buf), str);

Donc au lieu de ta ligne dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);

char str[50];
byte2Str(mfrc522.uid.uidByte, mfrc522.uid.size, str);
Serial.println(str);

J’ai pas pu tester, je n’ai pas d’arduino sous la main…

Merci sa compile directe :grin: par contre je n’ai pas tout compris comment sa fonctionne

void byte2Str(byte buf[], int taille, char str[])
{
    byte *pin = buf;
    const char * hex = "0123456789ABCDEF";   // D'où ça vient et a quoi ça sert

    int i = 0;
    for(i = 0; i < taille-1; ++i){
        *str++ = hex[(*pin>>4)&0xF];
        *str++ = hex[(*pin++)&0xF];
        *str++ = ':';
    }
    *str++ = hex[(*pin>>4)&0xF];
    *str++ = hex[(*pin)&0xF];
    *str = 0;
}

char str[50]; //la chaine de destination. attention, prévoir assez de caractères, sinon débordement.

pourquoi prevoire plusque [11] (11:17:2B:61 )

J'ai mis 50 parce que je me suis amusé a faire des tests sur PC et que j'avais pas envie de compter :D

Attention, quand on utilise des *char ou char[] en C (des chaines de caractères), il faut toujours ajouter 1 au nombre de caractères qu'il y aura au max. Car on ajoute un caractère '\0' pour clore la chaine. Dernièrement je me suis fait avoir, et mon programme faisait n'importe quoi car la chaine écrasait une autre variable.

Donc 12 dans ton cas et pas 11

En développant en C++ avec la class String, on aurai pas ce problème, mais je ne connais pas C++ assez pour t'en parler.

Donc 12 dans ton cas et pas 11 Oui excuse moi, j'avais écrit juste dans mon code :angry:

Et pour mon petit commentaire, tu poudrais m'expliquer

const char * hex = "0123456789ABCDEF"; // D'où ça vient et a quoi ça sert

C’est une chaine de caractères qui contient les caractères possibles en Hexa et dans l’ordre.

Dans le reste du code on fait une boucle qui récupère chaque byte, et on récupère dans la chaine hex les caractères correspondant.

Pour faire ça, on peut utiliser des opérateur bitwisse ( & ~ << >>) qui agissent en binaire.

Un octet c’est 2 fois 4 bits, chaque groupe de 4 bit étant un caractère en hexa :
00011000 → 0001 1000 → 1 8 → donc 18 en hexa (24 en decimal, mais on s’en fou)

Le (val>>4)&0xF permet de récupérer le 1 en décalant de 4 bit ta valeur et val&0xF le 8. (le &0xF étant un masque)
Ces valeurs récupérées donnent directement l’index du caractère correspondant en hexadecimal dans la chaine hex

Enfin, je sais pas si c’est clair, car c’est assez compliqué à expliquer

Pour tout savoir, voir ici et ici

La grande classe merci pour ce cour particulier, je vais potasser tout ça et essayer de comprendre ;)

J’abuse encore de votre savoir

Est-il possible d’obtenir directement une String au lieu du char où je cherche pour rien
J’ai déjà essayé pas mal de truc dons ça

void byte2Str(byte buf[], int taille, String str){
  
    byte *pin = buf;
    const char * hex = "0123456789ABCDEF";

    int i = 0;
    for(i = 0; i < taille-1; ++i){
        str += (*pin>>4)&0xF;
        str += (*pin++)&0xF;
        str += 'NUL';
    }
    str += (*pin>>4)&0xF;
    str += (*pin)&0xF;
    str += 0;
}

Bon bin j’espère que ça vous fais rire autan que je me suis creusé les neurones

Ce qui fonctionne pour un *char fonctionne pour String il me semble (pas l'inverse). Mais je peux pas en dire plus, je ne connais pas vraiment le C++

Et tu sais ce que ça donnerait ou où je pourrais trouver les infos pour changer ça parce que bien que j'aie compris le fonctionnement de ton code, je suis incapable de le refaire avec un String

Je viens de trouver ça.

#include <sstream>
#include <iomanip>

std::string hexStr(BYTE *data, int len)
{
    std::stringstream ss;
    ss<<std::hex;
    for(int i(0);i<len;++i)
        ss<<(int)data[i];
    return ss.str();
}

Mais je vois pas pourquoi tu insistes à vouloir ça en C++