JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Recherche d'une suite de valeurs dans un fichier binaire Lun 5 Avr 2010 - 15:47 | |
| Comme Panoramic ne permet pas la lecture de plusieurs octets à la fois dans un fichier binaire, le procédé indiqué est forcément très lent dès lors que la valeur cherchée se trouve loin dans un long fichier (cas par exemple des fichiers images). Il pourra difficilement être employé dans une boucle de lecture de plusieurs fichiers si les valeurs recherchées sont trop lointaines. - L'exploration se fait par lecture de blocs successifs (de longueur ajustable lbuf, à voir), entre deux positions données dans le fichier: p1 et p2. On peut évidemment avoir p1=0 et p2=FILEBIN_SIZE(n). - La séquence cherchée peut être donnée sous forme d'une suite de valeurs décimale, ou d'une chaîne en hexadécimal (dans ce cas précédée de "&h"). - Le résultat (1er emplacement trouvé de la chaîne, ou chaîne non trouvée) est affiché à l'écran pour l'exemple, mais peut être exploité à la demande. Et voilà le travail: - Code:
-
' Recseq.bas recherche d'une séquence dans un fichier binaire DIM f$, p, p1, p2, lbuf, a$, seq$, s$, i%, v%, k% DIM d, h$, lh% LABEL Recseq, DecHex, HexDec
p1 = 0: ' position de départ de recherche dans le fichier p2 = 10000: ' position de fin de recherche lbuf = 256: ' longueur du buffer de lecture seq$ = chr$(255) + chr$(192): ' Séquence cherchée, en Ascii (= FFC0) seq$ = "&hFFC0": ' ou la même, en hexadécimal
f$ = "C:\Graph\Jpg\IMG_2022.jpg"
GOSUB Recseq IF p <> -1 d = p: GOSUB DecHex PRINT "Trouvé en " + STR$(p) + " (= &h" + h$ + ")" ELSE PRINT "Non trouvé !" END_IF END
Recseq: ' recherche de la séquence seq$ dansle fichier binaire f$ ' retour: p = position trouvée (ou -1 sinon) s$ = seq$: h$ = UPPER$(s$) IF LEFT$(h$, 2) = "&H": ' valeur fournie en hexa, conversion en valeurs décimales h$ = UPPER$(MID$(s$, 3, LEN(s$)-2)) IF BIN_AND(LEN(h$), 1) = 1 THEN h$ = h$ + "0" GOSUB HexDec END_IF FILEBIN_OPEN_READ 1, f$ FOR p = p1 TO p2 STEP lbuf-LEN(s$)+1 FILEBIN_POSITION 1, p: a$ = "" FOR i% = 1 TO lbuf FILEBIN_READ 1, v%: a$ = a$ + CHR$(v%) NEXT i% k% = INSTR(a$, s$) IF k% > 0 THEN p = p + k% - 1: EXIT_FOR NEXT p IF k% = 0 THEN p = -1 FILEBIN_CLOSE 1 RETURN
DecHex: ' conversion décimal/hexa de d, résultat h$ (complété si utile à lh% caractères) h$="" REPEAT h$ = MID$("0123456789ABCDEF", 16*(d/16-INT(d/16))+1, 1) + h$: d = INT(d/16) UNTIL d <= 0 IF LEN(h$) < lh% THEN h$ = STRING$(lh% - LEN(h$), "0") + h$ RETURN HexDec: ' conversion hexadécimal/décimal de h$, résultat dans s$ s$ = "" FOR i% = 1 TO LEN(h$) STEP 2 v% = 16*(INSTR("0123456789ABCDEF", MID$(h$, i%, 1))-1) v% = v% + INSTR("0123456789ABCDEF", MID$(h$, i%+1, 1))-1 s$ = s$ + CHR$(v%) NEXT i% RETURN | |
|