Conversion Hex avec condition

[Résolu]
Signaler
Messages postés
5
Date d'inscription
mercredi 15 mars 2006
Statut
Membre
Dernière intervention
18 mars 2006
-
Messages postés
5
Date d'inscription
mercredi 15 mars 2006
Statut
Membre
Dernière intervention
18 mars 2006
-
Bonjour

Pour un projet d'etudiant, je doit traiter une base de donnée avec excel.
Cette base doit etre converti en trame ASCII oui Hexa suivant un formatage bien particulier
Pour la conversion Ascii, Hexa, je reussi a m'en sortir

voici a ce propos les codes :
'conversion CodeA en ASCII
Function ASCII(CodeA)
ASCII = Asc(CodeA)
End Function

'conversion string en trame hexa
Function Hexa(Str As String) As String
Dim car
For i = 1 To Len(Str)
car = Mid$(Str, i, 1)
Hexa = Hexa & HEX$(Asc(car))
Next
End Function

Par la suite, cette trame doit etre compresser pour etre envoyer dans un pic par le port serie
la trame ayant enormement de nombre, la compression s'effectue a ce niveau, en ne prennant que le quartet de poids faible de la conversion d'un nombre ASCII en Hexa
car :
pour de 0, le code hexa est 30, alors que je souhaite a $0
pour 1=$31, je veux $1
pour 2=$32, je veux $2
je sais c'est idio, suffirais de copier juste le caractere mais je n'ai pas que ca dans la trame.
en bref, je souhaiterais mettre une condition sur la conversion hexa pour que si c'est un nombre entre 0 et 9, il ne me garde que le quartet de poid faible

comment puis-je faire cela, mais connaisance en VB sont malheureusement bien basse

15 réponses

Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
Salut,



Private Sub Command1_Click()

MsgBox Hexa("0546.88,04646.28,37,R")

End Sub



Function Hexa(Str As String) As String

Dim i As Integer

Dim car As Byte

For i = 1 To Len(Str)

car = Asc(Mid$(Str, i, 1))

If car >= 48 And car <= 57 Then car = car - 48

Hexa = Hexa & Hex$(car)

Next

End Function


Daniel
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 112 internautes nous ont dit merci ce mois-ci

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
1 te renvoi la chaîne 31? tu peux reformuler/ré-expliquer stp?



et ta fonction ascii (qui me semble inutile) doit être typée.

'conversion CodeA en ASCII
Function ASCII(CodeA as string) as string
ASCII = Asc(CodeA)
End Function

à vérifier également si ce n'est pas un mot clef (logiquement non, mais bon....)
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
Function ASCII(CodeA as string) as integer '(woups)
Messages postés
5
Date d'inscription
mercredi 15 mars 2006
Statut
Membre
Dernière intervention
18 mars 2006

Merci pour la fonction de conversion ASCII (en tout cas, elle fonctionnait comme cela) je vias verifier cela



donc la base de donnée (qui est composée de coordoonée géographique et
d'autre chose) est convertie une fois en ASCII et ensuite en Hexa.
comme cette table va etre stocker dans une mémoire PIC, il faut
compresser les trames.



une trame est composé en gros, de chiffre, de virgule et point virgule et de lettre (avec principalement des chiffre)



nous somme d'accord que



ASCII -> HEXA

0 -> 30

1 -> 31

2 -> 32

... -> ...

9 -> 39





le code hexadecimal est sur 1 octet (8bit) ce qui nous donne 2 quartet (4bit)

avec a chaque fois pour les nombres, le quartet de poid fort = 3 et le quartet de poid faible qui vaut le nombre

comme ma trame est composé à 90% de chiffre, il y aura presque la
moitier de la trame avec des 3. donc la compression consiste a
supprimer ces 3 et a ne garder que le quartet de poid faible (cela
revient a ne pas faire de conversion)



donc je souhaiterais integrer cette condition dans le codage hexadecimal
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
pour ascii, çà marchait oui, mais sans type = variant, donc plus lourd inutilement



pour hexa, je ne vois pas comment tu passes de 0 à 30 jusque 9 à 39.



ce 0~9 est renvoyé par la fonction ascii, donc juste le asc des codes
ascii de 0 à 9 ; presques tous "matérialisés" par des carrés c'est bien
çà?



bref, sans comprendre on va essayer quand même...



pourquoi pas juste récupérer ta valeur - 30 ?....



met une trace, çà sera peut-être plus clair pour moi. (désolé ce soir j'suis pas en forme faut croire ^^)
Messages postés
5
Date d'inscription
mercredi 15 mars 2006
Statut
Membre
Dernière intervention
18 mars 2006

j'arrive pas a me faire comprendre ;-(, désoler, je vais faire un exmple, ca devrait plus vous parler

donc voici la trame en ASCII

<col width= \"193\"><col>
----
0546.88,04646.28,37,R

0546.88,04646.28,37,R

comme vous pouvez le constaté, quasiement que des chiffres

apres conversion en Hexa :

303534362E38382C30343634362E32382C33372C52

alors que je voudrait avoir :

05462E882C046462E282C372C52

(j'ai pas tout colorier, la fleme ;-))

en gros, quand c'est un caractere, je converti en hexa, quand c'est un
nombre, je laisse le nombre (ou je garde le quartet de poid faible de
la conversion hexa)



c'est juste que j'ai pas loin de 700 trames comme celle ci, donc a
mettre dans une mémoire pic, ca ne tiendra jamais, d'ou la compression
(si on peu appeller cela de la compression).





ASCII -> HEXA -> binaire

0 -> 30 -> 0011 0000 (en rouge, quartet de poid fort, en bleu quartet de poid faible)

1 -> 31 -> 0011 0001

2 -> 32 -> 0011 0010

................

9 -> 39 -> 0011 1001
<col width =\"357\"><col>
----
303534362E38382C30343634362E32382C33372C52



<col width=\"193\"><col>
----
0546.88,04646.28,37,R
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
Bonsoir,
Si test des positions de 2 en 2 "3 et 1....9"> Replace "xy" par "y" (par la 2me position)
en testant si "y" n'est pas une lettre.
Le code doit tenir sur une ligne
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
JMO -> non car la "trace" peut sans doute être entre-coupée de caractères à des positions et en nombre aléatoire








Ryback08 -> on va faire différemment.


je fais d'abord un exemple en chaîne pour le principe :






Option Explicit



Private Sub Form_Load()

Const sARACCOURCIR As String = "303534362E38382C30343634362E32382C33372C52"

Const sSOLUTION As String = "05462E882C046462E282C372C52"



Me.AutoRedraw = True

Me.Show



' pour comparer...

Me.Print sSOLUTION



Dim aTab() As String, i As Integer

ReDim aTab(0)



' à chaque fois qu'il y a un "3", c'est potentiellement une dizaine

For i = 1 To Len (sARACCOURCIR)

' on ajoute en tableau, on ne lira pas l'indice 0

ReDim Preserve aTab(UBound(aTab) + 1)



If Mid$(sARACCOURCIR, i, 1) = "3" Then

aTab(UBound(aTab)) = Mid$(sARACCOURCIR, i, 2)

' et on a 1 d'avance

i = i + 1

'Debug.Print aTab(UBound(aTab))

Else

aTab( UBound (aTab)) = Mid$(sARACCOURCIR, i, 1)

'Debug.Print aTab(UBound(aTab))

End If

Next i



' ici le tableau contient donc soit une
"chaine"
de 30 à 39, soit uniquement une lettre.

' on travaille le tableau et on sauve la chaîne à trouver

Dim sResultFinal As String

sResultFinal = vbNullString

For i = 1 To UBound (aTab)

If LenB(aTab(i)) > 2 Then aTab(i) = RightB$(aTab(i), 2)

sResultFinal = sResultFinal & aTab(i)

Next i



Erase aTab



Me.Print sResultFinal



End Sub





<small> Coloration
syntaxique automatique [AFCK]</small>









voilà, comme çà tu as la réponse fonctionnelle etc...


là où je suis sur la touche, c'est ton 0 -> 30. et j'insiste
lourdement parce qu'il y a peut-être une manière plus rapide en sachant
d'où vient cette convertion.


bref, au cas où, tu as toutes les cartes en main





++


PCPT [AFCK]
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
Re,
PCPT, finalement, il suffit simplement d'appliquer l'algo bulles ou shell-metzner
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
peut-être.... (connais pas)
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
voilà une réponse qui montre pourquoi je m'acharnais tant à demander plus d'explications.


bien vu Daniel!
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
ce que je comprends pas c'est comment il va faire pour "décompressé"

étant donné que 2 trames différentes pourront avoir le même résultat:

exemples:

MsgBox Hexa("PQR")

MsgBox Hexa("505152")


Daniel
Messages postés
5
Date d'inscription
mercredi 15 mars 2006
Statut
Membre
Dernière intervention
18 mars 2006

Merci PCPT et Gobillot, j'etudierais cela demain, il se fait tard



de PCPT :

voilà, comme çà tu as la réponse fonctionnelle etc...

là où je
suis sur la touche, c'est ton 0 -> 30. et j'insiste lourdement parce
qu'il y a peut-être une manière plus rapide en sachant d'où vient cette
convertion.



c'est la table de conversion ASCII -> Hex, j'invente rien !

regarde ici : http://www.table-ascii.com/



Décimal Octal Hex Binaire Caractère
------- ----- --- -------- ------
048 060 30 00110000 0
049 061 31 00110001 1
050 062 32 00110010 2
051 063 33 00110011 3
052 064 34 00110100 4
053 065 35 00110101 5
054 066 36 00110110 6
055 067 37 00110111 7
056 070 38 00111000 8
057 071 39 00111001 9




de Gobillot :



ce que je comprends pas c'est comment il va faire pour "décompressé"

étant donné que 2 trames différentes pourront avoir le même résultat:



la Trame ne sera pas décompressée (en fait, c'est ca la trame final)

elle sera dans un pic et l'on fera des tests dessus



en fait, la trame que vous voyer, ce sont les coordoonées polaire de radars fixe (avec la vitesse et le sens de flashage).

Pour un debut de projet (car on n'a malheureusement pas le temps de
terminer le projet cette année, ca sera pour le prochain millesime) je
dois constituer la trame suivant les criteres que nous a fixé le prof.

ensuite, on aura la carte avec la base de donnée dans le pic. un gps
brancher par une liaison serie. la carte lira les coordonnées du GPS et
les comparera a la base de donnée. un signal avertira si l'on se
raproche d'un radar. (voila en gros le projet)



++ et bonne nuité a vous
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
je prenais ton ASCII pour la fonction, et non pour le carac réel..

Asc("0") => 48 (et non pas 30)

là en effet, on peut faire Hex(Asc("0")) => 30



y'a des jours sans ^^
Messages postés
5
Date d'inscription
mercredi 15 mars 2006
Statut
Membre
Dernière intervention
18 mars 2006

je vient de tester la fonction de Gobillot, sa fonctionne



je vous remercie pour le temps que vous passer a nous aider.



effectivement, la solution est simple, enfin, j'arrive a la comprendre en la lisant mais je serais imcappable de la reproduire.



PCPT, je n'ai pas tester, mais je t'en suis infiniment reconnaisant, tu as du de triturer la tete pour nous pondre ca



passer tous une bonne nuit, cette fois, je vais me pieuter