cs_santiago69
Messages postés91Date d'inscriptionjeudi 18 novembre 2004StatutMembreDernière intervention17 décembre 2008
-
24 févr. 2007 à 12:22
cs_santiago69
Messages postés91Date d'inscriptionjeudi 18 novembre 2004StatutMembreDernière intervention17 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
A voir également:
Les données de chaîne ou binaires seront tronquées
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 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
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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 #
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_santiago69
Messages postés91Date d'inscriptionjeudi 18 novembre 2004StatutMembreDernière intervention17 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.
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 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
cs_santiago69
Messages postés91Date d'inscriptionjeudi 18 novembre 2004StatutMembreDernière intervention17 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 !