Comparaison binaire

Signaler
Messages postés
11
Date d'inscription
vendredi 2 janvier 2004
Statut
Membre
Dernière intervention
22 octobre 2007
-
Manu_12
Messages postés
11
Date d'inscription
vendredi 2 janvier 2004
Statut
Membre
Dernière intervention
22 octobre 2007
-
Bonsoir,

j'ai besoin de calculer la taille d'unfichier et de le mettre dans un en tete ID3 Tag V2 (MP3)..j'ai trouvé une source seulement il y a un bug sur les gros fichiers... en effet si mon entete fait 86782 bytes et que je fait une comparaison binaire (operateur AND) avec un autre chiffre j'ai ceci

10011111101110110 (1er chiffre)
1111111100000000 (2ieme chiffre - constante)
-----------------------
00011111100000000 (resultat normal)
alors que j'obtiens
10011111100000000

autrement dit la comparaison de la 1er position devrait renvoyer "0" (seuls 1 et 1 renvoi 1) mais comme la 1er positon est vide j'obtiens "1" !!
le resultat apres une divisionpra 256 donne 319 ce ki provoque une erreur ..car le resultat en byte ne peux depaser 255 !!

il faut donc que je "force" le 2ieme chiffre a mettre un "0" en 1 position pour que la comparaison soit correcte.

Comment faire ?

normalement

5 réponses

Messages postés
11
Date d'inscription
vendredi 2 janvier 2004
Statut
Membre
Dernière intervention
22 octobre 2007

oups..al mise en page a decaler..les 2 chiffres donnet bien positionnés

10011111101110110 (1er chiffre)
x1111111100000000 (2ieme chiffre - constante)

ou "x" est "vide" (chiffre + petit)

1 et vide donne 1..alors que ca devrait donner "0"...ou alors trouver comment forcer la valeur a prendre 1 "0" en 1er position dans la comparaison binaire :s
Messages postés
1858
Date d'inscription
samedi 29 juin 2002
Statut
Membre
Dernière intervention
17 octobre 2013
10
Salut

un petit bout de ton code s'il te plait.
Comment manipules-tu tes nombres ? en décimal, représentation hexadécimale, suite de 0 et 1 ?
(à propos, c'est 81 782 et non 86 782)
Messages postés
11
Date d'inscription
vendredi 2 janvier 2004
Statut
Membre
Dernière intervention
22 octobre 2007

voila le code..il n'est pas de moi..j'ai pas l'auteur mais je lai trouvé sur le site http://www.vbaccelerator.com c'est extrait d'un module gestionnaire de MP3..il fonctionne bien..mais pour les petits en têtes de fichiers...des que la variable transmise est importante la comparaison binaire ne marche plus..et comme le resultat est en byte..si ca depasser la valeur 255..ca provoquer une erreur "6" (depassement de capacité)

en "traduisant" en bits la varaible "lsize" et en faisant la comparaison avec la valeur binaire de "FF00" on obtient 2 séries de binaire de longueur différente...normalement en alignant a gauche pour la comparaison (lsize AND &HFF00)...la grande variable se retrouve sans rien dessous au 1er bit pour la comparaison..et au lieu de renvoyer "0"..elle renvoi 1 !!
en effet calcul a l'appui on devrai obtenir la suite de bits
00011111100000000 soit 16128 alors qu'on obtient
10011111100000000 soit 81664 qui divisé par &H100 renvoi 319 (donc erreur de capacité) plutot que 63 (3F en hexa)au lieu de 319.

'la fonction ci dessous traduit en hexa sur 4 bytes la taille de l'en tête MP3
(b est un tableau en byte, lstart la position de depart et lsize la taille de l'en tête...)

Private Sub setSize(b() As Byte, ByVal lStart As Long, ByVal lSize As Long)
b(lStart + 3) = lSize And &HFF
b(lStart + 2) = (lSize And &HFF00) \ &H100&
b(lStart + 1) = (lSize And &HFF0000) \ &H10000
b(lStart) = (lSize And &H7FFFFFFF) \ &H1000000
If (lSize And &H80000000) = &H80000000 Then
b(lStart) = b(lStart) Or &H80
End If
End Sub

Merci de votre aide.
Messages postés
1858
Date d'inscription
samedi 29 juin 2002
Statut
Membre
Dernière intervention
17 octobre 2013
10
Trouvé !

Private Sub setSize(b() As Byte, ByVal lStart As Long, ByVal lSize As Long)
b(lStart + 3) =  lSize And &HFF
b(lStart + 2) = (lSize And &HFF00 &)  \ &H100&
b(lStart + 1)  = (lSize And &HFF0000) \ &H10000
b(lStart) = (lSize And &H7FFFFFFF) \ &H1000000
If (lSize And &H80000000) = &H80000000 Then
b(lStart) = b(lStart) Or &H80
End If
End Sub


&HFF00 est un nombre codé sur 2 octets (Integer ou Boolean)

&HFF00& est un nombre codé sur 4 octets (Long) ce qui force
son écriture hexadécimale à "0000FF00"

Il semble que pour obtenir des résultats exacts avec les opérateurs logique (And, Or, Xor, Imp, Eqv), les deux opérandes doivent avoir la même "longueur"
Messages postés
11
Date d'inscription
vendredi 2 janvier 2004
Statut
Membre
Dernière intervention
22 octobre 2007

rene 38..je te rmerci bcp pour ton coup de main salvateur !!

voici donc les 2 formules poure "lire" la longueur d'un TAG MP3V2 version 3..

'lfromfile est une varialbe d type long (4 octets)..la formule renvoi la longueur du tag en décimal..ce qui evite de faire des boucles par pas de 1 octet pour arriver a trouver le Tag suivant est extraire les données du tag
Private Function getSize(ByVal lFromFile) As Long
Dim lR As Long
' Re-order the bytes:
lR = (lFromFile And &H7F000000) \ &H1000000
If (lFromFile And &H80000000) = &H80000000 Then
lR = lR Or &H80
End If
lR = lR Or ((lFromFile And &HFF0000) \ &H10000) * &H100&
lR = lR Or ((lFromFile And &HFF00&) \ &H100&) * &H10000
lR = lR Or (lFromFile And &H7F&) * &H1000000
If (lFromFile And &H80) = &H80 Then
lR = lR Or &H80000000
End If
getSize = lR
End Function
'celle ci enregistre sur 4 octets la longueur des tags et / ou de l'entete "ID3"
Private Sub setSize(b() As Byte, ByVal lStart As Long, ByVal lSize As Long)
b(lStart + 3) = lSize And &HFF
b(lStart + 2) = (lSize And &HFF00&) \ &H100&
b(lStart + 1) = (lSize And &HFF0000) \ &H10000
b(lStart) = (lSize And &H7FFFFFFF) \ &H1000000
If (lSize And &H80000000) = &H80000000 Then
b(lStart) = b(lStart) Or &H80
End If
End Sub