Pas d'inquiétude, avec PBAdonf, c'est dans la poche ! ^^

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 20-11-2012 10:19:26

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

[SOURCE] Viewer de données en hexa

Edit j'ai corrigé une info inexacte (pour n'importe quel type de données, blob() ne fonctionne pas, il faut passer par BlobEdit()) et mis quelques exemples

Bonjour, voici un bout de code que j'ai proposé dans une autre discussion permettant de visualiser un blob comme avec un éditeur hexadécimal.

Moi ça m'a beaucoup aidé pour diagnostiquer des problème d'encodage et de conversion de fichier.

C'est une fonction globale hexdump_blob() qui fabrique une chaîne avec les offsets, les octets et leur représentation. Vous pouvez l'écrire ensuite dans un fichier, ou simplement faire un MessageBox() avec (si le texte est plus grand que l'écran, vous avez tout de même la possibilité de faire un Ctrl-C de la messagebox pour coller ensuite dans un éditeur de texte)

Exemple avec le code suivant :

Code: pb

double dbl = 42.42
blob{128} bl

messagebox("hex string", hexdump_blob(blob("Hello, world!"), false))

blobedit(bl, 1, dbl)
messagebox("hex double", hexdump_blob(bl, false))


On obtient http://i.imgur.com/BYGBh.png

Quelques notes :
- ça fonctionne avec un blob en paramètre, mais vous pouvez l'utiliser sur n'importe quel string en passant par blob(votre_variable) ou n'importe quel type de données avec blobedit() (il faut d'abord allouer un blob suffisamment grand)
- je fournis les fonctions dépendantes replaceall() et iif()
- le code présenté est en pur PB script, ce qui a comme défaut d'être très lent si vos données dépassent quelques centaines d'octets à cause de la fonction replaceall(). Moi j'utilise en vrai à la place la fonction fastreplaceall() de mon extension pbniregex codée en C++ et qui accélère énormément le traitement
- parfois ça ne fonctionne pas correctement sur de grosse données (dump de fichier bmp) avec le replaceall() pbscript, je n'ai pas trouvé pourquoi peut-être un dépassement de capacité des chaînes ?

Enjoy !

Code: pb

global type hexdump_blob from function_object
end type

forward prototypes
global function string hexdump_blob (blob abl_data, boolean ab_fill_lastline)
end prototypes

global function string hexdump_blob (blob abl_data, boolean ab_fill_lastline);//hexify a blob content
// seki - 2011

string ls_tohex = "0123456789ABCDEF"
string ls_msg = "", ls_line, ls_binary
long i, j, length
byte b
string ls_fill

if isnull( abl_data ) then return ""

if ab_fill_lastline then
    ls_fill = " __"
else
    ls_fill = "   "
end if

length = len( abl_data )
for i = 1 to length
    GetByte( abl_data, i, b )
    ls_line += mid( ls_tohex, 1+ mod(int(b/16),16), 1)
    ls_line += mid( ls_tohex, 1+ mod(b,16), 1)
    ls_line += " "
    ls_binary += string( iif(b>31 and b<128,char(b)," "))
    if mod(i,16) = 0 and i > 0 then
        ls_binary = replaceall( ls_binary, "~r", "·")   //no cr/lf
        ls_binary = replaceall( ls_binary, "~n", "·")
        ls_binary = replaceall( ls_binary, "~t", "·")
        ls_msg += "[" + string( i - 16, "0000") + "] " + ls_line + "~t" + ls_binary + "~r~n"
        ls_line = ""
        ls_binary = ""
    end if
next
i -- // i - 1 due to the last loop in for
ls_line += fill(ls_fill, 3 * ( 16 - mod(i, 16) ) )
ls_msg += "[" + string( i - mod(i,16), "0000") + "] " + ls_line + "~t" + ls_binary

return ls_msg

end function

Code: pb

global type iif from function_object
end type

forward prototypes
global function any iif (boolean ab_cond, any aa_true, any aa_false)
end prototypes

global function any iif (boolean ab_cond, any aa_true, any aa_false);
// simulates the VB iif or C ternary operator

if ab_cond then
    return aa_true
else
    return aa_false
end if

end function

Code: pb

global type replaceall from function_object
end type

forward prototypes
global function string replaceall (string as_source, string as_pattern, string as_replace)
end prototypes

global function string replaceall (string as_source, string as_pattern, string as_replace);//remplace toute les occurences de as_pattern de as_source par as_replace 
string ls_target
long i, j

ls_target=""
i = 1
j = 1
do
    i = pos( as_source, as_pattern, j )
    if i>0 then
        ls_target += mid( as_source, j, i - j )
        ls_target += as_replace
        j = i + len( as_pattern )
    else
        ls_target += mid( as_source, j )
    end if
loop while i>0

return ls_target
end function

Dernière modification par seki (20-11-2012 12:31:19)


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#2 20-11-2012 11:52:19

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: [SOURCE] Viewer de données en hexa


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#3 20-11-2012 12:46:11

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [SOURCE] Viewer de données en hexa

Mise à jour des explications.


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22