Codage binaire d'une donnee

[Résolu]
Signaler
Messages postés
91
Date d'inscription
jeudi 18 novembre 2004
Statut
Membre
Dernière intervention
17 décembre 2008
-
Messages postés
91
Date d'inscription
jeudi 18 novembre 2004
Statut
Membre
Dernière intervention
17 décembre 2008
-
Salut a tous,
Je voudrais savoir s'il existe une fonction qui permette d'obtenir le codage binaire d'une variable.

Par exemple :
Dim A as Byte
A = 12
Le codage binaire de A est 00001100

Les autres types de donnee sont beaucoup plus complexes, il y a des bits de signe, des bits de nulite (Null pour les variant par ex) etc...

Mon besoin immediat concerne les dates, je voudrais savoir comment est codee une date pour la transformer en binaire, la decouper en petits morceaux et l'inclure dans une cle de licence (codage base 64).
Si vous avez une autre methode pour cette fin, pourquoi pas, mais je suis quand meme bien curieux de savoir comment VB code une date, un double, un long, etc...

Merci d'avance
Bonne prog a tous
Santiago

8 réponses

Messages postés
4525
Date d'inscription
dimanche 29 septembre 2002
Statut
Modérateur
Dernière intervention
22 avril 2019
9
Oups... ouai c'etait le type date bon c'est pas grave c'est exactment pareil :

Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Sub Form_Load()
    Debug.Print D2b(#21/12/1978#)
    Unload Me
End Sub

Private Function D2b(ByVal d As Date) As String
    Dim i    As Integer
    Dim b(7) As Byte
    CopyMemory b(0), d, 8
    For i = 7 To 0 Step -1
        D2b = D2b & B2b(b(i))
    Next
End Function

Private Function B2b(ByVal b As Byte) As String
    Dim i As Integer
    For i = 7 To 0 Step -1        If (b And 2 ^ i) Then B2b B2b & "0" Else B2b B2b & "1"
    Next
End Function

E.B.
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Ce n'est pas une question de VB mais de normalisation. Quelque soit le langage un double ou une date ou autre doit etre toujours codé de la même façon. (A noter qu'il existe plusieurs formats de date)

Normalement, tous ces format sont normalisés au niveau international et doivent etre je pense couverts par une rfc du consortium IEEE.

A noter qu'il existe 2 catégories d'enregistrement des variables qui peuvent rendre les données imcompatibles. Il sagit de l'endianess de la donnée. Les 2 principaux sont le Little Endian et le Big Endian. Le format Little Endian est utiliser sur des systèmes "Intel Compatibles". Il touche entre-autre Intel, AMD, ...(Windows par ex). Dans ce format c'est l'octet de poid faible qui est enregistré en premier sur le disque.
Le format Big Endian est "Motorola compatible" et touche aussi bien Motorola (Apple par ex) que Sparc (Sun Microsystem). Dans ce format c'est le poid fort que est enregistrer en premier.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
J'ai oublier la première partie.

Pour la conversion d'une donnée en représentation binaire, il n'existe pas de fonction en VB. Il faut le faire à la main.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
4525
Date d'inscription
dimanche 29 septembre 2002
Statut
Modérateur
Dernière intervention
22 avril 2019
9
L'informatique c'est pas compliqué c'est des 0 et des 1 une fois qu'ona bien compris ça tout le reste coule de source. Alors avant de vouloir convertir il faut comprendre.

"Qu'est ce que je veux obtenir et a partir de quoi ?"

Tu nous dis que tu veux du binaire, hors ce que tu veux c'est une representation sous forme de chaine d'une donnée qui elle est deja en binaire. Alors dans ce cas on s'assoie on ce calme et on reflechis. Tout ce qui ce fait sur ton ordinateur est en binaire. Que ce soit un long un integer une chaine une dll un fichier un son peut importe ce ne sont QUE des 1 et des 0. La seul difficulté c'est d'acceder a la donnée elle meme. Donc pour avoir la "representation binaire" d'une varibale de type long par exemple tu va devoir filtrer chaque "bit" qui la conpose. Si tu te souvient de tes cours de math tu vas te souvenir que pour filter un bit il te suffit d'effectuer un "masque binaire". Le bit 1,2,3,4,5..n peut s'ecrire 2^n donc pour savoir si le bit n est allumé sur la variable x tu fais Bit = x and not 2^n. Tu fais de meme pour tout les bit de la donnée et voila...

C'est adaptable a tout les type de donnée a condition de savoir ce que l'on test si c'est une variable a virgule il va te faloir "caster" en integer en faisant une copie avec MemoryCopy par exemple.

@+

E.B.
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
30
Salut,
une Date est codée sur 64 bits, comme un Double, donc en flottant (norme IEEE 754)

    Dim dt As Date
    Dim db As Double
   
    dt = Now
    db = dt
   
    If dt = db Then
       MsgBox "Date = Double"
       End If

Daniel
Messages postés
91
Date d'inscription
jeudi 18 novembre 2004
Statut
Membre
Dernière intervention
17 décembre 2008

Merci pour toutes ces reponses.
Si aucune fonction n'existe pour transformer une donnee en tableau de Byte alors il faut la faire. L'idee d'us me semble la plus simple, mais un probleme de taille se presente : les dates etant codees sur 8 octets et les entiers sur 4, je n'arrive pas a trouver de masque pour extraire tous les bits.
Pour repondre a us, je veux effectivement du binaire puisque c'est un passage oblige pour le codage en base 64 (si cela t'interesse, j'ai poste une source sur ce sujet http://www.vbfrance.com/code.aspx?ID=38257). Je veux comme je l'ai deja explique transformer une date en une serie de 64 bits, les melanger et les rediriger vers une sortie en base 64 (11 caracteres) qui rend la cle beaucoup plus lisible a l'utilisateur(AZ56g15RiI1 au lieu de &^^^^.!??&?g??).

Voila si vous avez une autre idee, je suis preneur, pour l'instant tout ce que j'arrive a faire, c'est d'ecrire la date dans un fichier temporaire et de la lire en 2 Long consecutifs. C'est vraiment barbare, j'aimerais trouver mieux !

Bonne nuit
Santiago

il y a 10 types de personnes : ceux qui comprennent le binaire et ceux qui ne le comprennent pas.
Messages postés
4525
Date d'inscription
dimanche 29 septembre 2002
Statut
Modérateur
Dernière intervention
22 avril 2019
9
Des fois j'ai l'impression de parler pour ne rien ou bien que personne ne me comprend ! lol


Bon voila un exemple de ce que je disais plus haut:


Option Explicit


Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)


Private Sub Form_Load()
    Debug.Print D2b(3.14159265)
    'Debug.Print D2b(0)
    'Debug.Print D2b(1)
    Unload Me
End Sub


Private Function D2b(ByVal d As Double) As String
    Dim i    As Integer
    Dim b(7) As Byte
    CopyMemory b(0), d, 8
    For i = 7 To 0 Step -1
        D2b = D2b & B2b(b(i))
    Next
End Function


Private Function B2b(ByVal b As Byte) As String
    Dim i As Integer
    For i = 7 To 0 Step -1        If (b And 2 ^ i) Then B2b B2b & "0" Else B2b B2b & "1"
    Next
End Function

a toi de modifier a ta guise

@+

E.B.
Messages postés
91
Date d'inscription
jeudi 18 novembre 2004
Statut
Membre
Dernière intervention
17 décembre 2008

Merci EbartSoft,
Desole d'avoir tant tarder a te remercier. J'etais en vadrouille.
Cette fonction CopyMemory de kernel32 correspond merveilleusement a mes besoins.
Merci beaucoup !