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

VB.NET Discussion :

Nombre BigInteger vers binaire et inversement


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Aucune
    Inscrit en
    Mars 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune

    Informations forums :
    Inscription : Mars 2014
    Messages : 34
    Points : 11
    Points
    11
    Par défaut Nombre BigInteger vers binaire et inversement
    Salut, voici un code créer des mes propre main et sans aide, autant dire que j'en suis très fier car dès aujourd'hui, j'ai compris comment ça fonctionnais
    C'est super facile en faite !

    Le code fonctionne avec des BigInteger, comme ça, pas de soucis de débordement
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    Imports System.Numerics
     
    Module Module1
     
        Function Bin(ByVal Nombre As BigInteger)
     
            Dim Binaire As String = ""
            Dim NombreSortie As BigInteger = 0
     
            Do
     
                NombreSortie = Nombre / 2
                Binaire += (Nombre - (NombreSortie * 2)).ToString
                Nombre = NombreSortie
     
            Loop Until Nombre = 0
     
            Return StrReverse(Binaire)
     
        End Function
     
        Function BinVal(ByVal Bin As String)
     
            Dim NombreSortie As BigInteger = 0
            Dim Bite As String = ""
     
            If Bin > "" Then
     
                For Index = 1 To Bin.Length
     
                    Bite = Bin.Substring(Index - 1, 1)
     
                    If Bite = "0" Then
                        NombreSortie *= 2
     
                    ElseIf Bite = "1" Then
                        NombreSortie *= 2
                        NombreSortie += 1
                    End If
     
                Next
     
                Return NombreSortie
            Else
     
                Return ""
            End If
     
        End Function
     
        Sub Main()
     
            Dim NombreOriginale As BigInteger = BigInteger.Parse("1234567890123456789012345678901234567890")
            Dim NombreVersBinaire As String = Bin(NombreOriginale)
            Dim BinaireVersNombre As BigInteger = BinVal(NombreVersBinaire)
     
            Debug.WriteLine(NombreOriginale.ToString & " En Binaire = " & NombreVersBinaire)
            Debug.WriteLine(NombreVersBinaire & " Vers Nombre = " & BinaireVersNombre.ToString)
     
        End Sub
     
    End Module
    N'oubliez pas d'ajouter la référence System.Numerics à votre projet pour que ceci fonctionne !

  2. #2
    Membre éprouvé Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Points : 1 118
    Points
    1 118
    Par défaut
    Edit : je reprend la forme de mon commentaire qui passais pour condescendant.

    Félicitation pour ton programme, cela fait toujours plaisir de réussir quelque chose sur lequel on a passé du temps.

    Tu peux faire tout simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
                  int a = 254;
     
                Console.WriteLine("Binaire     : {0}", Convert.ToString(a,2));
                Console.WriteLine("Octal       : {0}", Convert.ToString(a, 8));
                Console.WriteLine("Hexadécimal : {0}", Convert.ToString(a, 16));
     
     
                Console.ReadLine();
    et je sais aussi que l'on peut faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     BigInteger b = BigInteger.Parse("1234567890123456789012345678901234567890");
      Console.WriteLine("Hexadécimal : {0}", b.ToString("X"));
    Après une première recherche, on ne peut pas provider les BigInteger en binaire simplement en string. En revanche par une requête Linq qui prend les éléments hexa 4 par 4 et les transforme en base 2 tu doit pouvoir faire le taf en une ligne de code sans réaliser un seul calcul.
    "Le train de tes injures roule sur le rail de mon indifférence."

    "Monde de merde !!"

    Georges Abitbol.

  3. #3
    Membre éprouvé Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Points : 1 118
    Points
    1 118
    Par défaut
    For fun :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    BigInteger b = BigInteger.Parse("1234567890123456789012345678901234567890");
     
    var arr = b.ToByteArray().Select(x =>Convert.ToString( Convert.ToInt32(string.Format("{0:X2}", x), 16),2)).Aggregate(new StringBuilder(), (sb,current)=> { return sb.Append(current);}).ToString();
    "Le train de tes injures roule sur le rail de mon indifférence."

    "Monde de merde !!"

    Georges Abitbol.

  4. #4
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Juste sur le code (pas sur la manière de procéder) il y a moyen de simplifier encore un peu :
    Pas besoin de formater le byte en string hexa pour le convertir en entier en base 16 et reconvertir ça en base 2 il existe déjà une surcharge de Convert.ToString qui prend un directement byte et une base.
    Du coup on peut se passer du Select et directement faire un Aggregate et tant qu'à faire laisser tomber le bloc "lambda" qui se contente de retourner une valeur et directement passer une lambda "inline" (ça évitera deux accolades et un return inutiles)
    Sur un plan un peu plus personnel, je préfère utiliser la surcharge d'Aggregate qui prend en plus un "resultSelector" pour appliquer une transformation finale au dernier résultat accumulé et ainsi retourner le StringBuilder.ToString là plutôt que de faire le ToString à la fin

    Ce qui donne :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var number = BigInteger.Parse ("1234567890123456789012345678901234567890");
     
    var binaryString = number.ToByteArray ()
        .Aggregate (new StringBuilder (),
                   (builder, x) => builder.Append (Convert.ToString (x, 2)),
                    builder => builder.ToString ());

    Maintenant je ne suis pas certain qu'en l'état ça donne forcément les bons résultats, ToByteArray renvoie les bytes dans "l'ordre inverse" (Little Endian) il faudrait donc soit parcourir à l'envers (avec un Reverse) soit insérer en début de StringBuilder (avec Insert(0, valeur)) mais surtout parce qu'il y a potentiellement un élément en plus pour le bit de signe si nécessaire qui fausse les choses

    Cordialement !
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  5. #5
    Membre éprouvé Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Points : 1 118
    Points
    1 118
    Par défaut
    Oui ok, effectivement c'est mieux, j'avoue que j'ai pas forcément chercher à l'optimiser, j'aurais dû, c’était juste pour la faisabilité.


    Merci pour le retour ^^.
    "Le train de tes injures roule sur le rail de mon indifférence."

    "Monde de merde !!"

    Georges Abitbol.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Aucune
    Inscrit en
    Mars 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune

    Informations forums :
    Inscription : Mars 2014
    Messages : 34
    Points : 11
    Points
    11
    Par défaut
    Bonjour, merci pour vos retour même si c'est en VB.Net que j'ai codé et pas en #C

  7. #7
    Membre éprouvé Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Points : 1 118
    Points
    1 118
    Par défaut
    C'est pas grave c'est de .Net, tu peux écrire la même chose en vb.
    "Le train de tes injures roule sur le rail de mon indifférence."

    "Monde de merde !!"

    Georges Abitbol.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Aucune
    Inscrit en
    Mars 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune

    Informations forums :
    Inscription : Mars 2014
    Messages : 34
    Points : 11
    Points
    11
    Par défaut
    Sehnsucht, ton code ne fonctionne pas il me semble, après vérification, il semble erroné !
    Convertie en VB.Net:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim Nombre = BigInteger.Parse("1234567890123456789012345678901234567890")
            Dim Binaire = Nombre.ToByteArray().Aggregate(New StringBuilder(), Function(builder, x) builder.Append(Convert.ToString(x, 2)), Function(builder) builder.ToString())
            Debug.WriteLine(Binaire)
    Ton code montre: 1234567890123456789012345678901234567890 = 1110100000110010010010000001110101110000001101101111110011101110001010110010111100010111111001011011001110001111110000101011010010
    Mon code Montre: 1234567890123456789012345678901234567890 = 110100101010111111110011101001011010111111011110010101100101110001111001111011011110000001110101100000110010011010000011

    Ou est l’erreur ?

    worm83, ton code à toi bien qu’incompréhensible fonctionne très bien à première vue
    Merci.

  9. #9
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Probablement parce que je n'ai jamais prétendu qu'il était fonctionnel car en l'état aucune des versions présentées n'est totalement fonctionnelle (pour différentes raisons, certaines en partie expliquées dans mon précédent post)
    ci-joint un bout de code et un screen pour illustrer (note: le code n'est pas le plus propre du monde car ce n'était pas le but)

    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
    Imports System.Numerics
    Imports System.Text
     
    Module Module1
     
        Sub Main()
            Dim fromBinary = Function(str As String) As BigInteger
                                 Dim result = BigInteger.Zero
                                 Dim bit = ""
                                 For i = 0 To str.Length - 1
                                     result *= 2
                                     If str(i) = "1"c Then result += 1
                                 Next
                                 Return result
                             End Function
     
            Dim fcts As New Dictionary(Of String, Func(Of BigInteger, String)) From {
                {"Lord - Nelson", Function(number As BigInteger) As String
                                      Dim result = ""
                                      Dim tmp = BigInteger.Zero
                                      Do
                                          tmp = number / 2
                                          result &= (number - (tmp * 2)).ToString
                                          number = tmp
                                      Loop Until number = 0
                                      Return StrReverse(result)
                                  End Function},
                {"worm83", Function(number As BigInteger) number.ToByteArray.Select(Function(x) Convert.ToString(Convert.ToInt32(String.Format("{0:X2}", x), 16), 2)).Aggregate(New StringBuilder, Function(sb, current) sb.Append(current)).ToString},
                {"Sehnsucht", Function(number As BigInteger) number.ToByteArray.Aggregate(New StringBuilder, Function(builder, x) builder.Append(Convert.ToString(x, 2)), Function(builder) builder.ToString)}
            }
     
            For Each sample As BigInteger In {-255, -128, -127, 127, 128, 255}
                For Each fct In fcts
                    Console.WriteLine("{0,-13} : {1,4} => {2,-16} => {3}", fct.Key, sample, fct.Value(sample), fromBinary(fct.Value(sample)))
                Next
                Console.Write(New String("-"c, Console.WindowWidth))
            Next
        End Sub
     
    End Module
    Nom : Capture d’écran (78).png
Affichages : 223
Taille : 10,9 Ko
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  10. #10
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    The individual bytes in the array returned by this method appear in little-endian order. That is, the lower-order bytes of the value precede the higher-order bytes.
    (version "française" au besoin: )
    Les octets individuels du tableau retourné par cette méthode respectent l'ordre avec primauté des octets de poids faible (little-endian). Autrement dit, les octets d'ordre inférieur de la valeur précèdent les octets d'ordre supérieur.
    Autrement dit par exemple pour le nombre 256 ToByteArray renverra un tableau contenant {0, 1} c'est à dire le bit de poid-fort à la fin (sans compter le bit de signe éventuel) alors qu'en représentation "base 256" (la plage d'un byte) on écrirait plutôt 256 comme égal à 10 c'est à dire le bit de poid-fort au début
    C'est dans ce sens là que je parlais "d'inversé" ; en y mettant déjà des guillemets parce qu'il n'y a pas vraiment d'ordre plus légitime qu'un autre
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

Discussions similaires

  1. [Python 2.X] Signed float vers binaire, et inversement
    Par Gloubichou dans le forum Général Python
    Réponses: 2
    Dernier message: 18/02/2015, 20h23
  2. Binaire vers Hexa et inversement
    Par Antoinejdu44 dans le forum Débuter
    Réponses: 42
    Dernier message: 03/03/2010, 14h35
  3. afficher un nombre sous format binaire?
    Par sofiane44 dans le forum C++
    Réponses: 2
    Dernier message: 20/01/2006, 18h47
  4. code c pour sockets (udp vers tcp et inversement)
    Par HiT dans le forum Développement
    Réponses: 11
    Dernier message: 19/11/2005, 18h03
  5. [ABAP] Convertir nombre decimal en binaire
    Par danael dans le forum SAP
    Réponses: 3
    Dernier message: 04/04/2005, 12h17

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