Decode texte hexa

Salut,

J’échange une méthode qui encode un texte en hexa

avec

une méthode qui décodera cet hexa vers du texte

utf-8 ?

Oui, un champ écrit à l’origine dans 4D

Je te propose du bien ringard :
<code 4D>
TRACE
C_ENTIER LONG($i_l;$codeCar_l;$digit_l;$octet_l)
C_BLOB($data_x)
TABLEAU ENTIER LONG($ms_al;0)
$jeu_t:=“utf-8”
$in_t:=“1234abcdéèçà👻”*10000

//faire…
$ms_l:=Nombre de millisecondes
CONVERTIR DEPUIS TEXTE($in_t;$jeu_t;$data_x)
C_COLLECTION($data_c)
$data_c:=Créer collection
Boucle ($i_l;0;Taille BLOB($data_x)-1)
$hexa_t:=Sous chaîne(Chaîne($data_x{$i_l};"&x");5)
$data_c.push($hexa_t)
Fin de boucle
$hexa_t:=$data_c.join()
AJOUTER À TABLEAU($ms_al;Nombre de millisecondes-$ms_l)

//…et défaire
$ms_l:=Nombre de millisecondes
FIXER TAILLE BLOB($data_x;Longueur($hexa_t)/2)
Boucle ($i_l;1;Longueur($hexa_t);2)
$codeCar_l:=Code de caractère($hexa_t[$i_l])
Au cas ou
: ($codeCar_l=49) //1
$digit_l:=1
: ($codeCar_l=50)
$digit_l:=2
: ($codeCar_l=51)
$digit_l:=3
: ($codeCar_l=52)
$digit_l:=4
: ($codeCar_l=53)
$digit_l:=5
: ($codeCar_l=54)
$digit_l:=6
: ($codeCar_l=55)
$digit_l:=7
: ($codeCar_l=56)
$digit_l:=8
: ($codeCar_l=57)
$digit_l:=9
: ($codeCar_l=65) //A
$digit_l:=10
: ($codeCar_l=66)
$digit_l:=11
: ($codeCar_l=67)
$digit_l:=12
: ($codeCar_l=68)
$digit_l:=13
: ($codeCar_l=69)
$digit_l:=14
: ($codeCar_l=70)
$digit_l:=15
Sinon
$digit_l:=0
Fin de cas
$octet_l:=$digit_l << 4
$codeCar_l:=Code de caractère($hexa_t[$i_l+1])
Au cas ou
: ($codeCar_l=49) //1
$digit_l:=1
: ($codeCar_l=50)
$digit_l:=2
: ($codeCar_l=51)
$digit_l:=3
: ($codeCar_l=52)
$digit_l:=4
: ($codeCar_l=53)
$digit_l:=5
: ($codeCar_l=54)
$digit_l:=6
: ($codeCar_l=55)
$digit_l:=7
: ($codeCar_l=56)
$digit_l:=8
: ($codeCar_l=57)
$digit_l:=9
: ($codeCar_l=65) //A
$digit_l:=10
: ($codeCar_l=66)
$digit_l:=11
: ($codeCar_l=67)
$digit_l:=12
: ($codeCar_l=68)
$digit_l:=13
: ($codeCar_l=69)
$digit_l:=14
: ($codeCar_l=70)
$digit_l:=15
Sinon
$digit_l:=0
Fin de cas
$data_x{$i_l\2}:=$octet_l+$digit_l
Fin de boucle
$out_t:=Convertir vers texte($data_x;$jeu_t)
AJOUTER À TABLEAU($ms_al;Nombre de millisecondes-$ms_l)

ASSERT(Position($out_t;$in_t;*)=1)
ALERTE(Chaîne($ms_al{1})+"/"+Chaîne($ms_al{2}))
//_
</code 4D>
La partie hexa vers texte est plutôt bavarde. En interprété, elle est plus lente que texte vers hexa, mais plus rapide en compilé.

PS
chaine de test telle que collée :
$in_t:=“1234abcdéèçà👻”*10000
Le gestionnaire de code du forum doit être emojivore.

Pour traduire de l’hexa vers un blob, je fais ça :
<code 4D>
$lg:=Longueur($hexa)\2
FIXER TAILLE BLOB($blob;$lg)
Si ($lg>0)
$listeCar:=“0123456789ABCDEF”
Boucle ($i;1;$lg)
$blob{$i-1}:=((Position($hexa[($i*2)-1];$listeCar)-1)16)+(Position($hexa[$i2];$listeCar)-1)
Fin de boucle
Fin de si
</code 4D>

Dans quel cas met-on un % dans la chaine hexa? Il semble que ce n’est pas systématique

Bonjour,

Le “%” sert généralement dans dans une expression pour marquer que ce qui suit est au format hexadecimal…

A+

: Stanislas

Pour traduire de l’hexa vers un blob, je fais ça :
Avec Position, on oublie souvent la magic star :
$blob{$i-1}:=((Position($hexa_t[($i2)-1];$listeCar)-1)16)+(Position($hexa_t[$i2];$listeCar)-1)
$blob{$i-1}:=((Position($hexa_t[($i
2)-1];$listeCar;)-1)16)+(Position($hexa_t[$i2];$listeCar;)-1)
Au bench, je passe de 591 à 169 ms. Si l’hexa n’est pas toujours en majuscules, on peut faire Majusc(hexa) avant.

: Bruno

Et voila :
J’utilisais cet algo basé sur la chaine “12…EF” avant, nettement plus élégant. Comme dit plus haut, celui basé sur Code de caractère + Au cas ou (codeCar) est bien lourd, mais il s’est montré plus rapide en compilé (facteur ~ 2), probablement parce qu’il travaille moins sur des chaines.