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 :

[QST] conversion string binaire vers void *


Sujet :

C++

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Par défaut [QST] conversion string binaire vers void *
    Bonjour a tous,
    j'ai un petit problème pour convertir une std::string vers un void*.
    Donc j'ai une fonction de decryptage RC4 qui a pour prototype:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void	decryptBin(const void *pBufIn, UINT nCount, string &output);
    Ce qui me pose problème est que pour l'instant ma chaine binaire est contenue dans une std::string
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string input="101110111111001100010110111010001101100101000000101011110000101011010011";
    Et je ne sais pas comment faire pour transformé cette string vers un void * ni comment obtenir sa taille.

    J'ai essayé une méthode un peux naïve qui ne fonctionne pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    string input="101110111111001100010110111010001101100101000000101011110000101011010011";
    void *buf=(void *)input.c_str();
    UINT count=input.length()*sizeof(TCHAR);
    string output;
    RC4obj->decryptBin(buf,count,output);
    Savez-vous comment je dois faire cette conversion ?

    Je vous remercie par avance pour votre aide

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    pourtant ça me parait correct et le moyen normal d'y parvenir.
    As-tu situé le problème ? Plus précisément que "ça marche pas" ?
    Peut-être faut-il incrémenter count, string::length() te retournera le nombre de caractères utiles dans la chaînes, ométant le \0 final.
    Es-tu sûr aussi que nCount soit la taille et non le nombre de caractères ? Auquel cas la multiplication par sizeof(TCHAR) est superflue, voire dangeureuse.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Par défaut
    J'ai déjà essayé de supprimer la multiplication par le sizeof.
    J'ai aussi testé l’incrémentation pour le length.

    Ceci ne donne aucun résultat.
    Je pense que la méthode de decryptage attents un void * contenant la representation binaire de la chaîne sur un char (ou TCHAR) .
    c'est a dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    string="0" --> void *="00110000"
    string="1" --> void *="00110001"

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,

    Avec Boost.dynamic_bitset peut être (à la volée) :

    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
     
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <iterator>
    #include <string>
    #include <boost\dynamic_bitset.hpp>
     
    int main()
    {
        typedef unsigned char byte_t;
        std::string input="111111110000000011111110000000011111110000000011";
        boost::dynamic_bitset<byte_t> input_bits(input);
        std::vector<byte_t> bytes;
        boost::to_block_range(input_bits,std::back_inserter(bytes));
        std::reverse(std::begin(bytes),std::end(bytes));
        std::cout<<std::hex;
        std::copy(std::begin(bytes),std::end(bytes),std::ostream_iterator<int>(std::cout," "));
     
        void *buf=reinterpret_cast<void*>(&bytes[0]);
        unsigned count=bytes.size();
        std::string output;
        //RC4obj->decryptBin(buf,count,output);
     
        return 0;
     
    }
    Edit: petite modif car le stockage n'est pas continu sur les bitset => passaeg par to_block_range

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Par défaut
    Bon j'ai réussi après quelque longue heures....
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    bool stringToVoidStar(const string& input, void*& void_buf, UINT& count_buf)
    {
    	string string_ToConvert=input;
    	while (((int)string_ToConvert.length() % 8) != 0)
    			string_ToConvert.insert(0,1,'0');
     
    	bool	bFailed = false;
    	UINT	nCountChar = string_ToConvert.length() / 8//8 bits
    		, nIndex_String_ToConvert = 0;
    	TCHAR	*tchar_buf=new TCHAR[nCountChar];
     
    	count_buf=  sizeof(TCHAR) * nCountChar;
    	::ZeroMemory(tchar_buf, count_buf);
     
    	for (unsigned int i = 0; (i < nCountChar) && (bFailed == false); ++i)
    	{
    		for(unsigned char maskBin=128; (maskBin != 0) && (bFailed == false); maskBin=maskBin>>1)
    		{
    			switch (string_ToConvert[nIndex_String_ToConvert])
    			{
    			case _T('0') :
    				break;
    			case _T('1') :
    				tchar_buf[i] |= maskBin;
    				break;
    			default :
    				bFailed = true;
    			}
     
    			++nIndex_String_ToConvert;
    		}
    	}
     
    	if (bFailed == true)
    	{
    		delete tchar_buf;
    	}
    	else
    	{
    		void_buf = (void*)tchar_buf;
    	}
     
    	return (bFailed == false);
    }
    Merci pour votre aide

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

Discussions similaires

  1. Conversion chaine binaire vers TimeDate48
    Par clem67 dans le forum VB.NET
    Réponses: 4
    Dernier message: 25/05/2011, 11h13
  2. Conversion double binaire vers décimal
    Par mess-mate dans le forum C++
    Réponses: 17
    Dernier message: 07/12/2008, 00h44
  3. Convertion d'un string 'binaire' vers un int
    Par Hokage dans le forum Débuter
    Réponses: 14
    Dernier message: 28/09/2007, 11h51
  4. Conversion String en Hexa ("1F") vers byte
    Par ducseb dans le forum Langage
    Réponses: 1
    Dernier message: 15/04/2006, 20h03
  5. conversion string vers int
    Par mathher dans le forum C++
    Réponses: 4
    Dernier message: 14/04/2006, 17h52

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