Bonjour!
J'essaye de transformer des caractères ASCII en leur valeur decimal modifiée ensuite pour trouver leur valeur binaire sur 6-bits.
Par exemple
u en ASCII a pour valeur décimal 117. Pour retrouver la valeur 6 bits on soustrait 48 à cette valeur décimale. Si le nombre est encore supérieur à 40 alors on soustrait encore 8. Ce qui nous donne 61:
117-48 =69 > 40
79-8= 61
Tout cela est expliqué dans les premières pages de l'article de Eric S. Raymond: "AIVDM/AIVDO protocol decoding"
Cependant, je n'arrive pas a effectuer cette procedure sous VBA.NET sauf pour les premiers chiffres.
En effet, lorsqu'on récupère la valeur numérique du symbole ASCII, par exemple 8, j'obtiens sa forme hexadecimale &H0000075 par la methode Asc([String]). Je lui applique alors Convert.ToInt64(value As Object , provider As IFormatProvider) J'obtiens alors une étrange forme à la fois décimale et à la fois hexadecimale: &H00000117. Je retire alors 48 puis 8 je me retrouve avec &H000000DF Lorsque j'applique ma division modulo 2:
- j'obtiens un reste de 1 et un quotient de &H00000070
- j'obtiens un reste de 0 et un quotient de &H00000038
- j'obtiens un reste de 0 et un quotient de &H0000001C
- j'obtiens un reste de 0 et un quotient de &H0000000E
- j'obtiens un reste de 0 et un quotient de &H00000007
- j'obtiens un reste de 1 et un quotient de &H00000004
- j'obtiens un reste de 0 et un quotient de &H00000002
- j'obtiens un reste de 0 et un quotient de &H00000001
- j'obtiens un reste de 1 et un quotient de &H00000000
Ce qui nous donne 100100001. Ce qui n'est pas du tout ce à quoi je devais m'attendre, je devais récupérer la valeur 111110.
Voici mon code, pouvez vous m'aider à comprendre pourquoi ma recuperation sous format 6-bit des caractères ASCII ne fonctionne que pour les chiffres?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 Dim traduction_binaire_de_ASCII As String = "" Dim tableau_decimal(40) As String Dim binaire_en_8 As Integer = 0 Dim dec As Integer = 0 Dim Remainder As Integer Dim result As String = "" Dim j As Integer = 0 Dim tableau_binaire(40) As String Dim message_binaire As String = "" 'on transforme les données ASCII en binaire For i = 0 To trames.Length - 1 'on récupère la valeur numérique de l'ASCII lu en 8 bits sous forme hexadécimale 'binaire_en_8 = Asc(trames.ElementAt(i)) binaire_en_8 = Asc("u") 'on le met sous forme décimal dec = Convert.ToInt64(binaire_en_8, 16) 'on la transforme en sa valeur ASCII en décimal 6 bits dec = dec - 48 If dec > 40 Then dec = dec - 8 End If 'tant que la valeur de dec est supérieure à zéro on fait la division binaire par 2 While dec > 0 remainder = dec Mod 2 dec /= 2 result = Remainder.ToString & result j = j + 1 End While 'on rajoute autant de zéro qu'il y a d'espaces vides suite à la division avec une taille maximale de 6. While j < 6 result = "0" & result j = j + 1 End While tableau_binaire(i) = result result = "" j = 0 Next For k = 0 To tableau_binaire.Length - 1 If tableau_binaire(k) = "" Then Exit For End If message_binaire = message_binaire & tableau_binaire(k).ToString Next Return message_binaire
Partager