Problème avec des chaînes en hexa

Signaler
Messages postés
10
Date d'inscription
dimanche 11 janvier 2004
Statut
Membre
Dernière intervention
17 juillet 2008
-
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
-
Bonjour,

j'ai un petit problème.
Je dois insérer une chaîne en hexa dans la base de registre à partir d'une constante définie (avec la fonction RegSetValueEx).
Je dois donc convertir cette chaine :
hex:4e,5b,00,3c
en :
\x4e\x5b\x00\x3c

Le problème, c'est que mon str_replace maison n'est pas d'accord sur le remplacement de , par \x car il n'y a pas de caractère hexa derrière. J'ai essayé avec \\x mais le résultat n'est plus bon. Comment pourrais-je procéder autrement ?

Auriez vous une idée ?
Merci de votre aide.

Guigui.

4 réponses

Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Essaye ca:

DWORD __stdcall Replace(LPSTR lpszIn, LPSTR lpszOut)
{
LPSTR lptr;
lptr = lpszOut;
do
{
if(*lpszIn ',') *((WORD*) lptr)++ 'x\\';
else *lptr++ = *lpszIn;
}while(*lpszIn++);
return (DWORD) (lptr-lpszOut);
}

char szIN[] = "4e,5b,00,3c";
char szOUT[16];
Replace(szIN, szOUT);
MessageBox(0, szOUT, 0, 0x40);

Neo_Fr
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Bonjour,

Voici un petit essai :

#include <stdio.h>





void Convertir
(
    const char* pszEntree // E:chaîne à convertir
   ,char*       pszSortie // S:chaîne résultat
)
{
   const char* pcEntree = pszEntree;
   char*       pcSortie = pszSortie;
   *pcSortie = 0; // terminateur par défaut




   // --- Pointer derrière le ':'
   while (*pcEntree  &&  *pcEntree != ':') ++pcEntree;
   if (*pcEntree != ':') return; // chaîne incorrecte
   ++pcEntree; // saute ':'




   // --- Remplir la chaîne résultat
   while(*pcEntree)
   {
      *pcSortie++ = '\\';
      *pcSortie++ = 'x';
      *pcSortie++ = *pcEntree++;
      *pcSortie++ = *pcEntree++;
      if (*pcEntree == ',') ++pcEntree; // saute ','
   }
   *pcSortie = 0; // terminateur
}





int main(void)
{
   const char* szChaine = "hex:4e,5b,00,3c";
   char szResultat[32];



   Convertir(szChaine,szResultat);
   printf("Entree = %s\n",szChaine);
   printf("Sortie = %s\n",szResultat);
   return 0;
}




Ce qui donne :

Entree = hex:4e,5b,00,3c
Sortie = \x4e\x5b\x00\x3c



Jean-François
Messages postés
10
Date d'inscription
dimanche 11 janvier 2004
Statut
Membre
Dernière intervention
17 juillet 2008

Bonjour,

Pour ceux que ca pourra aider :

char *src=KONFIGSTRING;
char dst[]=KONFIGSTRING; // pour allouer de l'espace ..
 int i=0,l=0;
char *p2=dst;
                       
for (char *p=src+4; *p;p+=3)
{
              *p2++ =(char) (hextoint(*p) << 4) + hextoint(*(p+1));
               l++;
}
*p2=0;

int hextoint(char c) {
  c = toupper(c);
  return (c > '9' ? c - 'A' + 10 : c - '0');
}

for (i=0;i<l;i++) printf ("%X ",0xFF&dst[i]);

Guigui.
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
Bonsoir,
...et en c++ standard pour ceux que ça intéresse :

#include
#include <sstream>

using namespace std;

string my_hex( const string & org )
{
    istringstream iss( org );
    ostringstream ret;
    string tmp;

    if ( getline( iss , tmp , ':' ) )
        while ( getline( iss , tmp , ',' ) )
            ret << "\\x" << tmp ;

    return ret.str().c_str();
}

void main()
{
    cout << my_hex( "hex:4e,5b,00,3c" ) << endl;
}