Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Pages: 1
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 :
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
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 !
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
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
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)
Hors ligne
Hors ligne
Mise à jour des explications.
Hors ligne
Pages: 1