conversion mot de 4 octets hexadecimal en decimal
Bonjour à tous,
je dois apres extraction des données dans un fichier binaire convertir des mots de 4 octets en décimal.
Pour ce faire j ai crée une structure qur voici:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
Public ils As trame_ILS
Public Type Word_ILS
bPoidsFaibles As Byte
bPoidsForts As Byte
bPoidsFaibles1 As Byte
bPoidsForts1 As Byte
End Type
Public Type trame_ILS
type_ILS As Word_ILS
num_ILS As Word_ILS
End Type |
Jusque là tout va bien puisque j'arrive à rescupérer mes 4 octets que je viens ensuite stocker dans un buffer de la manière suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
With ils
ils.num_ILS.bPoidsFaibles = buffer1(10)
ils.num_ILS.bPoidsForts = buffer1(11)
ils.num_ILS.bPoidsFaibles1 = buffer1(12)
ils.num_ILS.bPoidsForts1 = buffer1(13)
' ensuite je decode mon mot de 4 octets hexadecimal en decimal
type1 = ((ils.num_ILS.bPoidsForts1 * 256 * 256 * 256) + ils.num_ILS.bPoidsFaibles1 * 256 * 256) + ((ils.num_ILS.bPoidsForts * 256) + ils.num_ILS.bPoidsFaibles)
MsgBox type1
End With |
QUand je le décodage a la main je tombe bien sur la valeur désiré qui par exemple 885057083. J ai déclaré type1 en tant que long ( 32 bits). Et pourtant j ai un message d erreur " dépassement capacité".
Pourtant la valeur décimale est toujours positive donc je devrais declarer un unsigned mais j ai pas trouvé sous vb .
Je pense que c'est un probleme au niveau de la variable type1 mais je ne vois pas comment la déclarer autrement.
SI vous aveez des idées.
Merci
conversion mot de 4 octets hexadecimal en decimal
Merci pour ton interet.
PAr contre je ne comprend pas tout sur la syntaxe que tu as mis en ligne.
Qu entend tu par Dword.
Moi j ai gardé type1 en long et j ai juste remplacé ma ligne par celle que tu m as envoyé mais j ai toujours dépassement de capacité.
En gros pour que ca convertit correctement dois je juste remplacer :
Code:
1 2
|
type1 = ((ils.num_ILS.bPoidsForts1 * 256 * 256 * 256) + ils.num_ILS.bPoidsFaibles1 * 256 * 256) + ((ils.num_ILS.bPoidsForts * 256) + ils.num_ILS.bPoidsFaibles) |
par :
Code:
1 2 3
|
Type1=Clng("&h" & format(buffer1(13),"00") & format(buffer1(12),"00") & format(buffer1(11),"00") & format(buffer1(10),"00")) |
Merci encore
conversion mot de 4 octets hexadecimal en decimal
Salut et merci encore.Ca marche presque.
En effet ca marche bien pour quasi toute les valeurs sauf qu a un moment mon fichier contient les 4 octets suivant : 63 138 242 55 donc j ai mes buffers suivants :
buffer1(13) = 55 poids fort
buffer1(12) = 242
buffer1(11) = 138
buffer1(10) = 63 poids faibles
A la main je trouve la bonne valeur à savoir 938641983.
PAr contre quand j utilise ton code j ai la valeur suivante 938606655 et là j avouerai que je bloque.
J ai même fait une fonction a part pour ne tester que ta ligne de code pour voir si ce n était pas un probleme de taille de fichier ou autre et là pareil.
Code:
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
|
Private Sub test_click()
Dim num_enr As Long
Dim buffer1(20) As Byte
buffer1(13) = 55
buffer1(12) = 242
buffer1(11) = 138
buffer1(10) = 63
num_enr = CLng("&h" & Format(Hex(buffer1(13)), "00") & Format(Hex(buffer1(12)), "00") & Format(Hex(buffer1(11)), "00") & Format(Hex(buffer1(10)), "00"))
MsgBox buffer1(13)
MsgBox buffer1(12)
MsgBox buffer1(11)
MsgBox buffer1(10)
MsgBox num_enr
End Sub |
Pourtant si c est à cause du type de num_enr, c'est bizarre puisque ton code fonctionne prfois avec de nombre supérieur à 938641983.
Si vousa vez une idée je suis preneur.
Merci encore