IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Conversion flux binaire -> ascii -> hexa


Sujet :

C++

  1. #1
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut Conversion flux binaire -> ascii -> hexa
    Bonjour,

    N'étant franchement pas doué en c++, je vous expose mon problème :

    J'ai un vector dans lequel j'ai un flux pdf (c'est donc binaire).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	std::vector<unsigned char> vectorResult;
    - Il faudrait que je puisse convertir chaque element en son code ascii en bouclant sur chaque element du vecteur tant que
    - Je me retrouverai ainsi avec un tableau d'entier. Ce que je veux faire ensuite est de convertir chacun de ces entiers en son code hexadécimal (sur 2 chiffres).

    - Finalement, il faudrait concaténer chaque code hexadécimal pour faire un std::string.

    Je vous remercie de votre aide.

  2. #2
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut
    J'explique quand même le pourquoi du comment, je récupère un pdf dans mon vector. Si je le transforme directement en std::string, étant donné que ce n'est pas du texte tout con, cela coince au niveau du caractère NUL qui est considéré comme une fin de fichier.

    C'est pourquoi il faudrait que je procède a toute une série de conversions (c'est le moyen le plus simple que j'ai trouvé pour faire passer mon flux entier et le recupérer ENTIER après dans mon php)

  3. #3
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Si j'ai bien compris, du veux découper le binaire en mots de 8bits, puis mettre la représentation hexa de chaque mot à la suite dans un std::string ?
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  4. #4
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut
    voila c'est ca

  5. #5
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut
    Mon problème se situe au niveau de la conversion en hexa en fait

    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
    17
     
            unsigned int * TableauAscii = new unsigned int[bufsize];
    	unsigned char * TableauHexa = new unsigned char[bufsize];
     
    	int i=0;
    	while (i<vectorResult.size())
    	{
    		// On recupère le code ascii de chaque element du vecteur
    		TableauAscii[i] = vectorResult[i];
     
    		// On fait ici la conversion en hexadécimal (sur 2 chiffres)
    		sprintf(&TableauHexa[i], "%X", TableauAscii[i]);
     
    		// on récupère le résultat en hexa, on concatène le tout pour faire un string
    		// je sais pas trop comment faire pour l'instant
    		i++;
    	}
    Si quelqu'un pouvait m'aider sur ce coup ce serait sympa

    Merci

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    salut,
    tu peut faire un truc comme cela
    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
    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
     
    template <typename T>
    struct ConvertToHex
    {
    ConvertToHex(std::ostream & s,int NbC)
    :m_s(s),m_nbC(NbC)
            {
            //initialise le flux en hexa,majuscule et ecriture a gauche
            m_s<<std::hex<<std::uppercase <<std::right;
            }
     
    void operator()(const T & t)
            {
            //envoie t dans le flux sur 2 caractère
            m_s<<std::setw(m_nbC)<< static_cast<unsigned int>(t);
            }
     
     
    std::ostream & m_s;
    int m_nbC;
    };
     
    int main(int argc, char** argv)
    {
     
    std::vector<unsigned char> vectorResult;
    std::string resultat;
    std::stringstream iosout;
    //init du vecteur
    vectorResult.push_back(1);
    vectorResult.push_back(10);
    vectorResult.push_back(0xff);
     
     
    //caractère de remplissage
    iosout.fill('0');
    //convertion par le foncteur
    std::for_each(vectorResult.begin(),vectorResult.end(),  ConvertToHex<unsigned char>(iosout,2));
     
     
    //récuperation du résultat dans une string;
    iosout>>test;
    std::cout<<test<<std::endl;
    }

  7. #7
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut
    Ben on dirait que ca marche mongaulois c super. Par contre, je n'ai pas très bien compris les 3 push_back d'affilée

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par identifiant_bidon Voir le message
    Ben on dirait que ca marche mongaulois c super. Par contre, je n'ai pas très bien compris les 3 push_back d'affilée
    C'est juste pour mettre quelque chose dans le vector.
    Il y as une méthode plus rapide mais il faut un séparateur entre chaque valeur :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::stringstream iosout;
    iosout<<std::hex;
    //ici le separateur est un espace
    std::copy(vectorResult.begin(),vectorResult.end(),  std::ostream_iterator<int>(iosout, " "));
     
    std::string test;
    iosout>>test;

  9. #9
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut
    Ok super. Je te remercie ca marche très bien.

    Maintenant autre question, dans le code d'hier

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    std::string CObjetMetier::BlobToBlobVector(std::string result, const OBlob & m_blob)
    {
    	std::vector<unsigned char> vectorResult;
    	short status= OLOB_NEED_DATA;
    	int PositionFichier = 0;
    	unsigned long size;
    	unsigned long optchunk;
    	unsigned int bufsize;
     
    	size = m_blob.GetSize();
     
    	vectorResult.resize(size);//taille le vecteur à la taille maximum du blob
     
    	// calcul de la taille du buffertemporaire optimale
    	optchunk = m_blob.GetOptimumChunkSize();
    	bufsize = ((int)(32768/optchunk)) *optchunk;
     
    	bufsize = size;
    	unsigned char *BufferTmp = new unsigned char[bufsize];
     
    	unsigned long NbLue=0;
    	while(status == OLOB_NEED_DATA)	 
    	{
    	   NbLue = m_blob.Read(&status, BufferTmp,  bufsize );
     
             //blindage, au cas ou l'on dépasse la grandeur du vector
              if (PositionFichier + NbLue > vectorResult.size())
                {
    				vectorResult.resize(PositionFichier + NbLue);
                }
           for(int i=0 ; i < NbLue ; ++i) vectorResult[PositionFichier + i] = BufferTmp[i];
           PositionFichier += NbLue;
    	}
    Ca plante à cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	size = m_blob.GetSize();
    je ne sais pas encore pourquoi. Ca marche bien lorsque mon recordset ne me renvoie qu'un résultat mais s'il y en a plusieurs ca plante la a l'execution. J'essaie de voir ce qui cloche. Si jamais tu as une idée ...

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Je croyait que tu lisait tout le blob d'un coup??
    Sinon j en sais pas. Test si il est null ou ouvert
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (result.IsNull()) std::cout<<"Le BLOB est NULL"<<std::endl;
    if (result.IsOpen() ) std::cout<<"Le BLOB est ouvert"<<std::endl;

  11. #11
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Ton m_Blob a l'air d'avoir une valeur incorrecte je dirais.
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  12. #12
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut
    En effet je lis bien tout le blob d'un coup. La ou ça coince (a la ligne que j'ai donnée plus haut), c'est quand je vais lire plusieurs blob les uns après les autres. Lorsque la requete me renvoie qu'un resultat, je ne vais lire qu'un blob et là c'est la fête.

    maintenant si la requete me renvoie plusieurs resultats, je dois lire les blobs les uns derrière les autres et la ca coince. (oui dans ma base de données j'ai une colonne réservée aux blob). Dans ce cas la, j'ai m_blob isnull

  13. #13
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par identifiant_bidon Voir le message
    En effet je lis bien tout le blob d'un coup. La ou ça coince (a la ligne que j'ai donnée plus haut), c'est quand je vais lire plusieurs blob les uns après les autres. Lorsque la requete me renvoie qu'un resultat, je ne vais lire qu'un blob et là c'est la fête.

    maintenant si la requete me renvoie plusieurs resultats, je dois lire les blobs les uns derrière les autres et la ca coince. (oui dans ma base de données j'ai une colonne réservée aux blob). Dans ce cas la, j'ai m_blob isnull
    Tu as donc un problème de récuperation du blob, mais bon tu t'en douté

  14. #14
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut
    Bravo

    Bon je vais contourner le problème dans mon php en bouclant et en appelant la fonction plusieurs fois, puisque cela fonctionne quand la requete renvoit un element mais cela ne marche plus quand la requete en renvoie plusieurs

    Allez hop, j'passe en résolu. Merci bien

  15. #15
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par identifiant_bidon Voir le message
    Ben on dirait que ca marche mongaulois c super. Par contre, je n'ai pas très bien compris les 3 push_back d'affilée
    N'empêche que par rapport à ce que tu veux faire (autres posts), ce n'est pas génial, puisque tu multiplies inutilement par 3 la taille de ton fichier...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  16. #16
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    N'empêche que par rapport à ce que tu veux faire (autres posts), ce n'est pas génial, puisque tu multiplies inutilement par 3 la taille de ton fichier...
    +1

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Conversion chaînes binaires en ASCII sans LabVIEW
    Par menas dans le forum LabVIEW
    Réponses: 0
    Dernier message: 20/09/2012, 11h08
  2. [LabView 8.2] Conversion chaîne ascii en Hexa
    Par Lovechoco dans le forum LabVIEW
    Réponses: 0
    Dernier message: 29/04/2009, 10h00
  3. Conversion ASCII vers Hexa
    Par PtiBruno dans le forum C
    Réponses: 3
    Dernier message: 25/02/2008, 09h40
  4. conversion ascii to hexa
    Par Invité(e) dans le forum C
    Réponses: 16
    Dernier message: 30/03/2007, 10h11
  5. conversion : (Ascii en hexa) => nombre
    Par tut dans le forum C++
    Réponses: 3
    Dernier message: 21/04/2004, 14h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo