Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Conversion d'un fichier binaire en lignes de Datas | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Conversion d'un fichier binaire en lignes de Datas Ven 12 Fév 2010 - 17:39 | |
| Le but était d'intégrer une (petite) image dans un programme de façon à ne pas avoir de fichier joint. Ce n'est évidemment valable que pour de toutes petites images, genre icônes (bien que dans le principe on peut faire n'importe quelle longueur). Les octets binaires lus dans le fichier d'origine sont écrits sous forme hexadécimale dans les lignes de datas, enregistrées dans un fichier type texte. Pour l'utilisation, il faut ensuite copier/coller le contenu de ce fichier dans le source Panoramic concerné. Puis lire les lignes de data et les décoder en binaire dans un fichier qui deviendra l'image à lire (identique au fichier d'origine). Le programme ci-dessous est en deux parties: 1) l'encodage du fichier binaire en datas dans un fichier ascii. 2) le décodage de ces datas dans un fichier binaire, pour vérification. Remarque: ces opérations sont très longues, Panoramic n'est pas adapté au travail sur des fichiers binaires, du fait d'être obligé d'opérer octet par octet. A titre d'exemple, mon image d'origine fait 78000 octets l'encodage dure 45 secondes, et le décodage 25 secondes (par comparaison, la même chose en FreeBasic est quasiment instantanée, on lit le fichier binaire en une seule fois dans une chaîne et tout se fait en mémoire). Comme d'habitude, il faut changer les noms de fichiers en fonction de son environnement. Et voici le (court) programme: - Code:
-
' Fic2Dat.bas encodage d'un fichier binaire en lignes de datas ' Editer le résultat (fr$) et copier/coller les datas dans le source Panoramic dim f$, fr$, fn$, a$, b$, q$, h$, i, t, d, ldat%, lli% label Dec2Hex
f$ = "C:\Graph\Bmp\tst320.bmp": ' *** à modifier fr$ = "Z:\fpano.dat": ' *** à modifier
ldat% = 36: ' nb d'octets binaires par ligne de data (modulable) lli% = 2*ldat% + 6: ' longueur maxi de la ligne de data q$ = CHR$(34)
' Encodage du fichier f$ en lignes de datas (dans fichier ascii fr$) FileBin_Open_Read 1, f$: File_Open_Write 2, fr$ t = FileBin_Size(1) b$ = "DATA " + q$ for i = 1 to t FileBin_Read 1, d: Gosub Dec2Hex b$ = b$ + h$ if len(b$) >= lli% THEN File_WriteLn 2, b$ + q$: b$ = "DATA " + q$ next i if len(b$) > 6 then File_WriteLn 2, b$ + q$ FileBin_Close 1: File_Close 2 Print "Encodage terminé !" END
Dec2Hex: ' conversion décimal/hexa de l'octet d, résultat h$ sur 2 caractères h$="" REPEAT h$ = MID$("0123456789ABCDEF", 1+16*FRAC(d/16), 1) + h$ d = INT(d/16) UNTIL d <= 0 IF LEN(h$) < 2 THEN h$ = "0" + h$ RETURN
Dernière édition par JL35 le Ven 12 Fév 2010 - 23:21, édité 2 fois | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Conversion d'un fichier binaire en lignes de Datas Ven 12 Fév 2010 - 18:31 | |
| Un exemple d'une petite image jpg: - Code:
-
DATA "FFD8FFE000104A46494600010100000100010000FFDB0043000604050605040606050607" DATA "0706080A100A0A09090A140E0F0C1017141818171416161A1D251F1A1B231C1616202C20" DATA "232627292A29191F2D302D283025282928FFDB0043010707070A080A130A0A13281A161A" DATA "282828282828282828282828282828282828282828282828282828282828282828282828" DATA "2828282828282828282828282828FFC0001108002A001B03012200021101031101FFC400" DATA "190000030101010000000000000000000000050708040603FFC4002B1000020202010302" DATA "050403000000000000010203040511060012130721141522313216233341425161FFC400" DATA "1801000301010000000000000000000000000002050304FFC40022110001040104020300" DATA "0000000000000000010002031104051231512171416181FFDA000C03010002110311003F" DATA "007AF28BFC86BF29821C5A593078626A90A560F5EDCA5DC4EB665ED260548C46CAC0A9DB" DATA "3696723C5D21723CE79D70FF0052725366322B7EF559145BC7C361CD1951E34904712B01" DATA "E3D2B200FAEE0C0F71705BBE94E47C8061A4A30438EBB94BD71D962A948C5E4EC5525E43" DATA "E474508BF4A9627F29107DD8753863FD11E79353867BF36105C9944B3FC45E95A53237BB" DATA "17611302FB27643104ECECFDFACE4BAF0AD6887084AE19C698457049BFAAE2953F8ABF5B" DATA "2B8BA791A127969DB852C4327695EF4750CA744023608F6237D6AE943E9257CD7A7B44F1" DATA "EE59467305BC99157255A78E4A31092242B1ED99644EE94381B8C032480024B8DB7BA70A" DATA "448D6B5E430D8EFB4AAF58B97D0A5770986A8324B9E9B250D7A592A9007831B6A51E31E5" DATA "67050B986691BC5A2C54EFE8EE49061FD0307C6725965C171DC819D11F19632A26BD61A5" DATA "F176B7C4C93176EC0CA80043ECA0FF007D69F557894F5E8F29E455ECC4D5931F7325E299" DATA "4B341756A471C7343FD2BA8AF19493F28FF740EEF3031168F80706E43163B2782A982F97" DATA "A397DE3E8519A0B60300559DA273A05597E8653EEDEFB0351756D3B2334B4452EC039157" DATA "66C1EC755E894D1BC3790B88866ABE9E72AE175B2F16732096EA88EB63F1B2D8BD0D2B70" DATA "A149268E3919A531F86C4802A7E2A9B28E7B4C6F6A9660B9561B35268E7AD322C914B130" DATA "649108D86523D88208208E93F1E031792E7598A9C10E02A4B874C74A1AAC4BAA93F9ED09" DATA "D4788828ECB1C2B22FB19234F1129DC1D1ABC7B150607018CC453795EB63EAC552269482" DATA "EC91A050588006F406F4075470A192181B1CCFDEE1F3DF9FDF491E413617B65B2157118A" DATA "BB92C84BE1A54E17B13C9DA5BB23452CC740127401F6037D4F5C9389356E41CDE7CB5597" DATA "176799D58C62AA50C8CB1A412978AA9371622A8E5A6BB13B01E55FE6D16FF3A3FA0B8DE2" DATA "7C731756ED5C6603114EB5E4F1DA8ABD28E34B09A23B64014061A661A3BFB9FF007D7525" DATA "417D2B83E45C729F11B956B54CAE16940274AA7BA1995FB80B08DDABBEF78E52C18060EA" DATA "FBD82AEFDA743F0984C5606ABD5C1E328E36B3B991A2A75D214672002C428037A006FF00" DATA "E0E8874217FFD9" DATA "X" dim fn$, h$, d, i, b$ Label rr, Hex2Dec
fn$ = "Z:\image.jpg": ' fichier résultat (à modifier)
FileBin_Open_Write 2, fn$ rr: READ b$ if b$ <> "X" for i = 1 to len(b$) step 2 h$ = MID$(b$, i, 2): GOSUB Hex2Dec FileBin_Write 2, d Next i GOTO rr END_IF FileBin_Close 2 Picture 1 File_Load 1, fn$: ' stretch_on 1
End
Hex2Dec: ' conversion hexa/décimal de h$ (2 caractères), résultat dans d h$ = UPPER$(h$): ' à tout hasard d = 16 * (INSTR("0123456789ABCDEF", LEFT$(h$, 1)) - 1) d = d + INSTR("0123456789ABCDEF", RIGHT$(h$, 1)) - 1 RETURN Ne pas oublier de mettre une butée à la fin des datas (ici "X").
Dernière édition par JL35 le Dim 14 Fév 2010 - 16:57, édité 1 fois | |
| | | Invité Invité
| Sujet: Re: Conversion d'un fichier binaire en lignes de Datas Ven 12 Fév 2010 - 19:13 | |
| Oui j'ai essayer le 2e code qui donne un chien mais le premier je met les noms de fichiers correctement et après ...... |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Conversion d'un fichier binaire en lignes de Datas Ven 12 Fév 2010 - 20:54 | |
| As-tu attendu suffisamment longtemps ? si ton fichier source est un peu trop gros c'est très long (chez moi 80k -> 45 secondes d'encodage), il faudrait sans doute rajouter une barre de progression. | |
| | | Invité Invité
| Sujet: Re: Conversion d'un fichier binaire en lignes de Datas Ven 12 Fév 2010 - 22:34 | |
| Mon fichier avait 4k
Ouais et après j'attend là ça fait Encodage terminé ! et après Décodage terminé ! mais après ...
Dernière édition par Nicolas le Sam 13 Fév 2010 - 21:37, édité 1 fois |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Conversion d'un fichier binaire en lignes de Datas Ven 12 Fév 2010 - 23:08 | |
| Eh bien, après, comme j'ai dit, tu as dans le fichier fr$ la liste des lignes data. il faut lire le fichier dans un éditeur de texte, sélectionner tout, copier, puis coller le tout dans ton programme panoramic (par exemple dans l'exemple que j'ai donné ensuite, à la place de mes propres datas). Ou bien prendre le fichier fr$ comme nouveau fichier source panoramic, et coder le reste derrière, après les datas.
Je précise que dans le 1er listing le décodage ne sert à rien, c'était juste une vérification pour voir, en fait il faut supprimer tout ce qui est après "encodage terminé", et le sous-programme Hex2Dec, et ignorer aussi le fichier fn$.
Bon, du coup j'ai édité le 1er listing et j'ai supprimé les choses inutiles pour ne pas troubler les esprits.
Et j'ai également édité le 2ème listing, pour y mettre une image jpg (et non bmp), bien plus courte. On a intérêt, en effet, à utiliser dans ce cas le format jpg, bien plus compact, et pour des petites images, comme des icônes, la qualité n'est pas très importante (on ne voit pas la différence). Evidemment, le fichier d'origine et le fichier résultat doivent être au même format (bmp, ou mieux jpg), sinon ça ne marche pas.
Je rajoute que l'inconvénient d'une image jpg c'est qu'on n'a pas accès facilement à ses dimensions en pixels (largeur x hauteur), contrairement à une image bmp. Et aussi que ce fichier binaire peut être n'importe quoi, y compris par exemple un exécutable à transporter, mais alors gare à la longueur ! on voit bien qu'avec ce procédé, un octet binaire exprimé en hexadécimal occupe deux octets. | |
| | | Contenu sponsorisé
| Sujet: Re: Conversion d'un fichier binaire en lignes de Datas | |
| |
| | | | Conversion d'un fichier binaire en lignes de Datas | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |