1. #1
    Nouveau membre du Club
    Inscrit en
    septembre 2010
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : septembre 2010
    Messages : 70
    Points : 38
    Points
    38

    Par défaut Convertir une chaine en binaire en hexa

    Bonjour,

    J'ai vraiment du mal avec les conversions de chaines sous vb.net.
    J'aimerai pouvoir convertir une chaine string contenant du binaire (mais pas forcement sur 8 bits, ca peut etre 9 ou 7, etc..) en hexa.

    ci dessous la fonction que l'on m'a donné pour convertir de l'hexa vers du binaire que je trouve tres bien:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Private Function ConvertHexToBin(hex As String) As String
            Return String.Concat(hex.Select(Function(c) Convert.ToString(Convert.ToInt32(c, 16), 2).PadLeft(4, "0"c)))
        End Function
    J'ai essayé de l'adapter pour faire l'inverse , mais je n'arrive pas à la faire fonctionner, merci pour vos idées, par avance.
    J'avoue ne pas tous comprendre dans cette fonction que j'utilise et qui fonctionne tres bien, pour ma part j'avais modifié comme suit, mais j'ai vraiment pas du tout comprendre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	    Private Function ConvertirUneChaineBinenHex(bin As String) As String
            Return String.Concat(bin.Select(Function(c) Convert.ToByte(Convert.ToInt32(c, 2), 16).PadLeft(4, "0"c)))
        End Function

  2. #2
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    avril 2013
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2013
    Messages : 265
    Points : 0
    Points
    0

    Par défaut

    Bonjour,

    voici en image :
    Nom : Sans titre.jpg
Affichages : 39
Taille : 51,7 Ko

    Voici le code :
    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
    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
            TextBox4.Text = BinToHex(TextBox3.Text)
        End Sub
     
        Private Function BinToHex(Bin As String) As String
            If Bin Is Nothing Then
                Throw New ArgumentNullException("bin")
            End If
            If Bin.Length Mod 8 <> 0 Then
                Throw New ArgumentException("La longueur doit être un multiple de 8", "bin")
            End If
     
            Dim hex = Enumerable.Range(0, Bin.Length / 8).Select(Function(i) Bin.Substring(8 * i, 8)).Select(Function(s) Convert.ToByte(s, 2)).Select(Function(b) b.ToString("x2").ToUpper)
            Return String.Join(Nothing, hex)
        End Function
    Cordialement,

  3. #3
    Rédacteur/Modérateur
    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 157
    Points : 3 713
    Points
    3 713
    Billets dans le blog
    5

    Par défaut

    Bonjour,

    Attention, le code ne répond pas exactement au besoin. Il faut qu'il marche quelque soit la longueur de la chaîne d'entrée. Hors le code que tu fournies ne fonctionne que pour des codes dont la longueur est un multiple de 8.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  4. #4
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2011
    Messages
    1 813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : mars 2011
    Messages : 1 813
    Points : 3 384
    Points
    3 384

    Par défaut

    Salut, le Linq est-il vraiment nécessaire ici ?
    La chaine en entrée peut-elle dépasser 64 char ?
    Plus je connais de langages, plus j'aime le C.

  5. #5
    Nouveau membre du Club
    Inscrit en
    septembre 2010
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : septembre 2010
    Messages : 70
    Points : 38
    Points
    38

    Par défaut

    Bonsoir,

    Merci pour vos contribution.
    Visiblement le code fonctionne pour une chaine binaire pas forcement sur 8 bits.

    Par contre j'ai le warning suivant "conversion de double en integer" sur "bin.lenght" au niveau de cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim hex = Enumerable.Range(0, Bin.Length / 8).Select(Function(i) Bin.Substring(8 * i, 8)).Select(Function(s) Convert.ToByte(s, 2)).Select(Function(b) b.ToString("x2").ToUpper)
    Pour ma part, j'avais fais ca dans mon coin qui a l'air de fonctionner, mais qui est peut être un peu plus archaïque dans la méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	Private Function ConvertirBinenOctet (bin As String) As String
    		Dim chaineOctet As String = ""
    		Dim x = 0
    		Do While x < bin.Length
    		x = x + 4	
    		Dim Octet = Convert.ToString(Convert.ToByte(bin.Substring((bin.Length-x),4),2),16).ToUpper
    		chaineOctet = Octet + chaineOctet
    		Loop
    		Return chaineOctet
    	End Function

  6. #6
    Rédacteur/Modérateur
    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 157
    Points : 3 713
    Points
    3 713
    Billets dans le blog
    5

    Par défaut

    Citation Envoyé par yaume91 Voir le message
    Visiblement le code fonctionne pour une chaine binaire pas forcement sur 8 bits.
    Attention, le fait que cela te retourne un résultat ne signifie pas que le résultat est correct ! Si tu testes les valeurs suivantes, tu constateras que :
    • "10" = (rien)
    • "0010" = (rien)
    • "00000010" = 02
    • "000000010" = 01 !!!


    Citation Envoyé par yaume91 Voir le message
    Pour ma part, j'avais fais ca dans mon coin qui a l'air de fonctionner, mais qui est peut être un peu plus archaïque dans la méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	Private Function ConvertirBinenOctet (bin As String) As String
    		Dim chaineOctet As String = ""
    		Dim x = 0
    		Do While x < bin.Length
    		x = x + 4	
    		Dim Octet = Convert.ToString(Convert.ToByte(bin.Substring((bin.Length-x),4),2),16).ToUpper
    		chaineOctet = Octet + chaineOctet
    		Loop
    		Return chaineOctet
    	End Function
    Des fois, les solutions simples sont les plus efficaces

    Les solutions à base de requête Linq ont l'avantage d'être souvent compact, mais au prix d'un surcoût en terme de performance.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  7. #7
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2011
    Messages
    1 813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : mars 2011
    Messages : 1 813
    Points : 3 384
    Points
    3 384

    Par défaut

    Re,

    au cas où (avec la limite précisée plus haut) : txtOutput.Text = Convert.ToInt64(txtInput.Text, 2).ToString("X");

    Bonne continuation.
    Plus je connais de langages, plus j'aime le C.

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    avril 2013
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2013
    Messages : 265
    Points : 0
    Points
    0

    Par défaut

    Bonsoir,

    j'ai modifier mon code, il fonction avec 4 chiffre en longueur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Function BinToHex2(Bin As String) As String
            If Bin Is Nothing Then
                Throw New ArgumentNullException("bin")
            End If
            If Bin.Length Mod 4 <> 0 Then
                Throw New ArgumentException("La longueur doit être un multiple par 4", "bin")
            End If
            Dim hex = Enumerable.Range(0, Bin.Length / 4).Select(Function(i) Bin.Substring(4 * i, 4)).Select(Function(s) Convert.ToByte(s, 2)).Select(Function(b) b.ToString("x").ToUpper)
            Return String.Join(Nothing, hex)
        End Function
    cordialement,

  9. #9
    Nouveau membre du Club
    Inscrit en
    septembre 2010
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : septembre 2010
    Messages : 70
    Points : 38
    Points
    38

    Par défaut

    Merci à tous pour vos reponses et explications.
    En effet mes chaines binaires ne seront pas forcement un multiple de 4 bits, genre je peux avoir 7 ,115, .... du coup je vais voir si je peux adapter votre réponses à mon cas perso.


    Merci encore à vous tous.

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

Discussions similaires

  1. Convertir une chaine binaire en type long
    Par MedyAndFriends dans le forum Langage
    Réponses: 10
    Dernier message: 16/12/2011, 19h39
  2. Convertir une chaine binaire en INT
    Par Wiink dans le forum Requêtes
    Réponses: 6
    Dernier message: 22/08/2011, 12h59
  3. Convertir une chaine binaire en Real32
    Par clem67 dans le forum VB.NET
    Réponses: 3
    Dernier message: 24/05/2011, 19h00
  4. Convertir une chaine Type Hexa en Dec
    Par Nissartis dans le forum C
    Réponses: 7
    Dernier message: 14/04/2010, 10h07
  5. Convertir une chaine en binaire
    Par marmarbenh dans le forum IO
    Réponses: 7
    Dernier message: 11/12/2007, 17h43

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