Codage binaire d'une donnee

Résolu
cs_santiago69 Messages postés 91 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 17 décembre 2008 - 24 févr. 2007 à 12:22
cs_santiago69 Messages postés 91 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 17 décembre 2008 - 13 mars 2007 à 13:45
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

cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
27 févr. 2007 à 19:17
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.
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
24 févr. 2007 à 13:35
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 #
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
24 févr. 2007 à 13:38
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 #
0
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
24 févr. 2007 à 19:37
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
24 févr. 2007 à 21:09
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
0
cs_santiago69 Messages postés 91 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 17 décembre 2008
27 févr. 2007 à 16:09
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.
0
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
27 févr. 2007 à 19:14
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.
0
cs_santiago69 Messages postés 91 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 17 décembre 2008
13 mars 2007 à 13:45
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 !
0
Rejoignez-nous