Question Delphi
Question Delphi
Je sais que ca semble un peu irrelevant, mais est-ce que quelqu'un d'entre vous sait comment on écrit un fichier depuis des donnés en HEX (en Delphi).
Par exemple:
J'ai des valeurs de HEX que je veut écrire dans un fichier binaire, comme
01 00 00 51 50 9D 5A 50 50 56
Existe-t-il une fonction en Delphi pour faire des chose pareil?
Ne me demandez pas pourquoi je veux faire cela ;-)
-Vortex
Par exemple:
J'ai des valeurs de HEX que je veut écrire dans un fichier binaire, comme
01 00 00 51 50 9D 5A 50 50 56
Existe-t-il une fonction en Delphi pour faire des chose pareil?
Ne me demandez pas pourquoi je veux faire cela ;-)
-Vortex
- Skubidou
- Administrateur
- Messages : 2367
- Inscription : 19 juil. 2003 17:39
- Localisation : Lonzée (B)
- Contact :
On m'a appelé?
Ben, si j'ai bien compris, tu veux écrire des nombres Hexa dans un fichier (binaire je suppose).
En gros, tu prends un tableau de taille fixe de Byte, tu y mets tes données (même si tu remplis pas le tableau), puis il y a une séries de fonctions pour:
- ouvrir le fichier
- définir que tu travailles par Byte (c'est pas optimisé, car en fait ça veut dire que tu écris 1 byte à la fois dans le fichier, mais ça à l'avantage de pouvoir écrire le nombre de bytes voulu, même un nombre premier comme 47 bytes)
- Ecrire ton tampon (avec un write je crois), en donnant la longueur de test données
- si tes données sont importantes (un BL4), tu peux pas faire un tableau de la longueur variable du BL4, alors tu boucle pour remplir ton tableau fixe et l'écrire
- fermer le fichier
Le code avec mes 2 fonctions pour lire et écrire mes tableau dynamiques de Byte:http://skubidou.free.fr/Export/Memory_IO.zip
Dans ce code, tu verras un 'TFlexible_Byte_Array', en fait, c'est simplement un 'Array Of Byte' (tableau dynamique de byte) qui est définit dans un autre .pas. Le reste, c'est du code Delphi pur.
Skubidou:~
![Clin d'oeil ;)](./images/smilies/icon_wink.gif)
Ben, si j'ai bien compris, tu veux écrire des nombres Hexa dans un fichier (binaire je suppose).
En gros, tu prends un tableau de taille fixe de Byte, tu y mets tes données (même si tu remplis pas le tableau), puis il y a une séries de fonctions pour:
- ouvrir le fichier
- définir que tu travailles par Byte (c'est pas optimisé, car en fait ça veut dire que tu écris 1 byte à la fois dans le fichier, mais ça à l'avantage de pouvoir écrire le nombre de bytes voulu, même un nombre premier comme 47 bytes)
- Ecrire ton tampon (avec un write je crois), en donnant la longueur de test données
- si tes données sont importantes (un BL4), tu peux pas faire un tableau de la longueur variable du BL4, alors tu boucle pour remplir ton tableau fixe et l'écrire
- fermer le fichier
Le code avec mes 2 fonctions pour lire et écrire mes tableau dynamiques de Byte:http://skubidou.free.fr/Export/Memory_IO.zip
Dans ce code, tu verras un 'TFlexible_Byte_Array', en fait, c'est simplement un 'Array Of Byte' (tableau dynamique de byte) qui est définit dans un autre .pas. Le reste, c'est du code Delphi pur.
Skubidou:~
- Skubidou
- Administrateur
- Messages : 2367
- Inscription : 19 juil. 2003 17:39
- Localisation : Lonzée (B)
- Contact :
J'oubliais...
Si ton but est de remplacer une série de bytes dans un fichier existant (un patch), tu ouvre le fichier en lecture et ecriture (si je me rappelle bien, tu met le filmode à0 pour lire, puis tu passe en filemode=1 pour écraser), tu lis le fichier jusqu'à ce que tu arrive au bon index, puis tu write le tampon pour qu'il écrase, et tu ferme le fichier.
Skubidou:~
Si ton but est de remplacer une série de bytes dans un fichier existant (un patch), tu ouvre le fichier en lecture et ecriture (si je me rappelle bien, tu met le filmode à0 pour lire, puis tu passe en filemode=1 pour écraser), tu lis le fichier jusqu'à ce que tu arrive au bon index, puis tu write le tampon pour qu'il écrase, et tu ferme le fichier.
Skubidou:~
WAHHHH?!?! Ca allait vite! Je savais que vous êtes tous en ligne au moment, hehe ;-)
Merci Skubi - en fait, je voulais écrire un fichier de taille fixe (environ 4 milles byte) en utilisant des code hex. C'est tout. Bon, je vais tester tes fonctions ;-) Mais probablement pas avant demain matin. Je suis trop fatigué au moment pour coder, lol.
-Vortex
Merci Skubi - en fait, je voulais écrire un fichier de taille fixe (environ 4 milles byte) en utilisant des code hex. C'est tout. Bon, je vais tester tes fonctions ;-) Mais probablement pas avant demain matin. Je suis trop fatigué au moment pour coder, lol.
-Vortex
umm, ok, enfin, j'ai regargé les fichiers (même si je suis fatigué) et j'ai un problème. Je ne suis pas du tout expert en Delphi. Je fait ca comme hobby de temps en temps alors j'ai jamais vraiment eu besoin d'écrire des donnés binaire dans un fichiers. Alors, franchement, je pige très peu de tes fonctions, hehe ;-) Comment fais-je pour passer les differents valeurs HEX (comme 3E ou F2 ou 06) au variables pour l'écrire dans le fichier?
-Vortex
-Vortex
- Skubidou
- Administrateur
- Messages : 2367
- Inscription : 19 juil. 2003 17:39
- Localisation : Lonzée (B)
- Contact :
Ben, heu, ....
Imagine que tu as un tableau de taille fixe (4000 bytes), de bytes:
Var Tableau: Array[0..3999] Of Byte;
Si tu veux le remplir, en laissant des blancs (par exemple si tu ne dois rajouter des données qu'à l'index 20, 40, 60, ...), je te conseille d'initialiser le tableau pour être sûr d'avoir des 00 au reste.
For Tableau_Index:= 0 to 3999 do Tableau[Tableau_Index]:= $00
Ensuite, je sais pas d'où tu tire tes données. Si tu les calcul à partir d'autres données, ben il suffit d'implémenter
Tableau[25]:= [la valeur que tu veux y donner];
Si c'est une donnée fixe
Tableau[26]:= $FF;
Mais avec ce système, tu veux entrer 4000 valeurs, ca va te faire 4000 implémentation
Tes données sont dans quoi?
Skubidou:~
Imagine que tu as un tableau de taille fixe (4000 bytes), de bytes:
Var Tableau: Array[0..3999] Of Byte;
Si tu veux le remplir, en laissant des blancs (par exemple si tu ne dois rajouter des données qu'à l'index 20, 40, 60, ...), je te conseille d'initialiser le tableau pour être sûr d'avoir des 00 au reste.
For Tableau_Index:= 0 to 3999 do Tableau[Tableau_Index]:= $00
Ensuite, je sais pas d'où tu tire tes données. Si tu les calcul à partir d'autres données, ben il suffit d'implémenter
Tableau[25]:= [la valeur que tu veux y donner];
Si c'est une donnée fixe
Tableau[26]:= $FF;
Mais avec ce système, tu veux entrer 4000 valeurs, ca va te faire 4000 implémentation
![Pleure ou Très triste :cry:](./images/smilies/icon_cry.gif)
Tes données sont dans quoi?
Skubidou:~
Ah bon, d'accord. Non, tu sais, j'avais pas vraiment compris comment je devait passer les valuer HEX au array. Bon merci, je vais recommencer ;-)
Le fait que se sont 4000 implémentions n'est pas un problème. 99% des valeurs sont les même, sauf quelques'une. Alors la, je fait simplement und loop et ca devrait marcher.
Merci milles fois Skubi!
-Vortex
Le fait que se sont 4000 implémentions n'est pas un problème. 99% des valeurs sont les même, sauf quelques'une. Alors la, je fait simplement und loop et ca devrait marcher.
Merci milles fois Skubi!
-Vortex
Woohoo, tout a bien marché. Merci milles fois Skubi. Alors, pour expliquer pourquoi je voulais savoir tout ca - il y a 2 ou 3 jours j'ai commencé à analyser les fichiers circuits.bin des différentes tracks (juste par curiosité et pour savoir comment Sik fait les fichiers). Par consequence (avec l'aide d'un editeur de Hex) j'ai réussi à identifier les paramètres pour le track). Ben, alors je me disais, il serait cool si je pourrais faire des version cd-patchables de mes tracks moi-même. Alors j'ai testé et j'ai réussi â le faire dans l'éditeur. Finalement, j'ai écrit un petit programme pour créer le fichier circuits.bin d'un track avec les donnés importantes. Alors, c'est pour ca que je voulai écrire des valeur de hex ;-)
Maintenant il me reste qu'un seul problème. Comment peux-je convertir un image dans le format RAW pour l'utiliser dans Pod. J'ai déjà essayer de l'enregistrer en format RAW dans Photoshop, mais ca ne marche pas. Ca marche seulement si d'abord j'ouvre un fichier déjà utilisé dans pod (comme nuke.img).
-Vortex
Maintenant il me reste qu'un seul problème. Comment peux-je convertir un image dans le format RAW pour l'utiliser dans Pod. J'ai déjà essayer de l'enregistrer en format RAW dans Photoshop, mais ca ne marche pas. Ca marche seulement si d'abord j'ouvre un fichier déjà utilisé dans pod (comme nuke.img).
-Vortex
- Skubidou
- Administrateur
- Messages : 2367
- Inscription : 19 juil. 2003 17:39
- Localisation : Lonzée (B)
- Contact :
Ben tu sais Vortex...Le programme il existe déjà... (en Delphi
) La seule raison pour laquelle on ne l'a pas distribué, c'est que dans le circuit.bin, il y un index, un ID, qui doit être unique pour chaque circuit, et on s'est dit que la seule façon de ne pas avoir de problème de doublon, c'était de centraliser la création des circuits.bin chez nous, parce que si chacun crée son circuits.bin dans son coin avec son ID, on va finir avec des bugs dans Pod (c'était le cas avec le premier Aztec Beta qui avait le même ID qu'un autre circuit et ça générait des bugs. Le Aztec999 ou je sais plus comment de Flywheel contenait simplement un ID corrigé).
Pour le raw, Pod à un bug de paresse. Les img des circuits sont en 256 couleurs paletisées, mais pod est paresseux, lorsque tu arrives sur la page des circuit, il charge la palette du IMG correspondant au track par 'défaut'. Mais si tu clique sur un autre track, il lit l'IMG du 'nouveau' track, mais ne lit pas la palette de ce nouvel IMG, et ré-utilise la seule palette qu'il a lu au début. Donc, il faut absoluement n'utiliser que la palette standard d'Ubisoft, ou alors il faut rechanger tous les img des tracks (ce qu'avais fait FlyWheel dans Europa). En fait, si tu veux pas de bug, il faut obligatoirement que tous les IMG des circuits utilisent exactement la même palette. Et la seule façon d'être sûr que tous les fichiers ont la même palette (même chez un 'novice', c'est d'utiliser la palette des circuits originaux).
Skubidou:~
![Clin d'oeil ;)](./images/smilies/icon_wink.gif)
Pour le raw, Pod à un bug de paresse. Les img des circuits sont en 256 couleurs paletisées, mais pod est paresseux, lorsque tu arrives sur la page des circuit, il charge la palette du IMG correspondant au track par 'défaut'. Mais si tu clique sur un autre track, il lit l'IMG du 'nouveau' track, mais ne lit pas la palette de ce nouvel IMG, et ré-utilise la seule palette qu'il a lu au début. Donc, il faut absoluement n'utiliser que la palette standard d'Ubisoft, ou alors il faut rechanger tous les img des tracks (ce qu'avais fait FlyWheel dans Europa). En fait, si tu veux pas de bug, il faut obligatoirement que tous les IMG des circuits utilisent exactement la même palette. Et la seule façon d'être sûr que tous les fichiers ont la même palette (même chez un 'novice', c'est d'utiliser la palette des circuits originaux).
Skubidou:~
Ooops, alors d'une certaine facon j'ai touché du terrain interdit ;-) lol
Ben, écoute, le ID dont tu parle - j'ai remarqué ca aussi. Ca commence (chez les tracks fournis avec l'installation de pod) avec 50, 51, 52, 53, 54, 55, 56 (comme valuer hex bien sur) et après ca commence à devenir fous et il n'y a plus un vrai système (ou au moins, je l'ai pas trouvé). En fait, je me disais aussi que ca doit etre un ID unique, mais quand j'ai installé un track avec un cicuits.bin modifíée dont le ID était déjà utilisé par un autre track, il n'y avait aucun problème, aucun bug.
Bon, je comprends pourquoi c'est pas accessible au public, c'est logique et franchement j'ai soupconné déjà un programme pour créer les bins. Mon prog a probablement aussi plein de bugs (car il y a des paramètres dont je connais pas encore la fonction). Mais, tu sais, je suis toujours curieux et quand je trouve quelque chose comme ca, ca me fascine, hehe ;-)
Pour les IMG, alors que doit je faire exactement pour convertir mes images. Sik ma demandé de lui envoyer un image en noire et vert, mais quand j'ouvre les IMG, je recois simplement un image en 'grayscale'.
-Vortex
Ben, écoute, le ID dont tu parle - j'ai remarqué ca aussi. Ca commence (chez les tracks fournis avec l'installation de pod) avec 50, 51, 52, 53, 54, 55, 56 (comme valuer hex bien sur) et après ca commence à devenir fous et il n'y a plus un vrai système (ou au moins, je l'ai pas trouvé). En fait, je me disais aussi que ca doit etre un ID unique, mais quand j'ai installé un track avec un cicuits.bin modifíée dont le ID était déjà utilisé par un autre track, il n'y avait aucun problème, aucun bug.
Bon, je comprends pourquoi c'est pas accessible au public, c'est logique et franchement j'ai soupconné déjà un programme pour créer les bins. Mon prog a probablement aussi plein de bugs (car il y a des paramètres dont je connais pas encore la fonction). Mais, tu sais, je suis toujours curieux et quand je trouve quelque chose comme ca, ca me fascine, hehe ;-)
Pour les IMG, alors que doit je faire exactement pour convertir mes images. Sik ma demandé de lui envoyer un image en noire et vert, mais quand j'ouvre les IMG, je recois simplement un image en 'grayscale'.
-Vortex
- Skubidou
- Administrateur
- Messages : 2367
- Inscription : 19 juil. 2003 17:39
- Localisation : Lonzée (B)
- Contact :
Heu, je sais plus les bugs, mais je sais qu'il y en a. Je me rapelle que l'on avait des problèmes avec Aztec (mais je ne sais plus du tout te dire si c'était des plantages ou autre) qui avait le même ID que Special, jusqu'au jours ou FlyWheel a mis une version corrigée chez QBall. C'est quand j'ai étudié les .bin que j'ai trouvé que la modif qu'il avait fait avait été de corriger l'ID et c'est là que l'on a fait attention de ne pas avoir des ID communs avec Flywheel ou les circuits originaux.
L'ID est composé de 2 bytes. Le premier est à 1 dans les 16 premiers circuits de Ubisoft et à 2 pour les suivants, ainsi que ceux de Flywheel, le 2e est incrémenté de circuit en circuit (0 à 40) et Flywheel a continué la suite après ceux d'Ubisoft (41 à 43, en décimal, pas Hexa). Lorsque l'on a commencé les reskins, Flywheel faisait encore des circuits, donc on a décidé de commencer à 100 pour ne pas se marcher sur les pieds.
Pour les IMG, je ne sais pas comment tu les importe ou autre, mais dans l'IMG des circuits (tous les img n'ont pas le même format), il y a 3 images:
- L'image qui apparait dans le choix du circuit, constituée d'une palette de 256 couleurs 24bits, puis de l'image en elle même, qui est constituée d'index vers cette palette (donc 1 byte par pixel). C'est possible que si tu ne lis que cette image, tu ai du grayscale si tu te réfère à une palette de gris. Si tu as le bon dessin, c'est que tu lie bien l'image, mais les couleurs dépendent de la palette utilisée.
- Les images du nom de circuit en normal et en reverse, sur fond beige-rose, qui servent dans le menu multi-joueur, quand le nom du circuit sélectionné pour la course apparait dans la colonne de droite. Ces images sont en 16Bits Pod (5R,6G,5B).
Pour exporter la première image, soit tu crée un GIF ou un BMP paletisé, soit tu exporte ton image en RAW ou TGA, en remplacant simplement ton index par la couleur 24 bits correspondante dans la palette.
Pour l'importation, Il faut d'abord crée une image noir et verte (parce que ce sont les seules couleurs de la palette standard des IMG) et n'utilisant que les couleurs de la palette. Lors de l'importation de ton RAW, il faut donc utiliser la palette d'un IMG standard, lire ton image raw, et créer l'image paletisée, en reprenant donc la palette standard, et en crée l'image indexée par rapport à cette palette.
Je ne reviendrai pas sur le débat de savoir pourquoi on a pas distribué tous les programmes et informations en public (on m'a même accusé de faire cela pour me faire du fric sur le dos de Pod), mais Pod est remplit de bugs de gestion mémoire, de trucs bizarre, ... et on s'est dit que la seule façon d'éviter des bugs dans Pod était de garder un contrôle, de façon a vérifier que les règles 'anti-bug' sont respectées. C'est comme quand tu installe 60 circuits dans Pod, des fois ça passe, et d'autres fois ça plante, ca n'a pas été facile de déterminer que si ton pod plante au milieu de la course, c'est parce que tu as trop de circuits dans ta liste (cherchez le rapport). Ben pour l'ID du circuit, c'est le même, ainsi que la palette (au début, je recréais une palette en fonction de l'image, ce qui permettait même de créer une image avec d'autres couleurs que le vert, et celui qui faisait son image, ben il avait pas de bug, parce qu'il était déjà sur son circuit, donc c"était sa palette qui était lue et bien souvent, il ne passait pas vers les autres circuits. C'est quand il l'a passé à quelqu'un d'autre que l'on s'est rendu compte du bug. C'est comme la longeur de 8 caractères pour le nom de circuit. Pod accepte plus (Discover s'appelait d'ailleurs Discovery au début), mais le CDPatcher n'accepte pas plus de 8.
Ce que je veux dire par là, c'est que toutes les règles 'anti-bug' que l'on a, ce n'est absoluement pas pour ennuyer le gens, ce sont des règles que l'on s'est donnée après avoir détecté des bugs, et il y en a sans doute d'autres que l'on a pas encore décelée, comme les nouveaux circuits qui plantent par moment...
Skubidou:~
L'ID est composé de 2 bytes. Le premier est à 1 dans les 16 premiers circuits de Ubisoft et à 2 pour les suivants, ainsi que ceux de Flywheel, le 2e est incrémenté de circuit en circuit (0 à 40) et Flywheel a continué la suite après ceux d'Ubisoft (41 à 43, en décimal, pas Hexa). Lorsque l'on a commencé les reskins, Flywheel faisait encore des circuits, donc on a décidé de commencer à 100 pour ne pas se marcher sur les pieds.
Pour les IMG, je ne sais pas comment tu les importe ou autre, mais dans l'IMG des circuits (tous les img n'ont pas le même format), il y a 3 images:
- L'image qui apparait dans le choix du circuit, constituée d'une palette de 256 couleurs 24bits, puis de l'image en elle même, qui est constituée d'index vers cette palette (donc 1 byte par pixel). C'est possible que si tu ne lis que cette image, tu ai du grayscale si tu te réfère à une palette de gris. Si tu as le bon dessin, c'est que tu lie bien l'image, mais les couleurs dépendent de la palette utilisée.
- Les images du nom de circuit en normal et en reverse, sur fond beige-rose, qui servent dans le menu multi-joueur, quand le nom du circuit sélectionné pour la course apparait dans la colonne de droite. Ces images sont en 16Bits Pod (5R,6G,5B).
Pour exporter la première image, soit tu crée un GIF ou un BMP paletisé, soit tu exporte ton image en RAW ou TGA, en remplacant simplement ton index par la couleur 24 bits correspondante dans la palette.
Pour l'importation, Il faut d'abord crée une image noir et verte (parce que ce sont les seules couleurs de la palette standard des IMG) et n'utilisant que les couleurs de la palette. Lors de l'importation de ton RAW, il faut donc utiliser la palette d'un IMG standard, lire ton image raw, et créer l'image paletisée, en reprenant donc la palette standard, et en crée l'image indexée par rapport à cette palette.
Je ne reviendrai pas sur le débat de savoir pourquoi on a pas distribué tous les programmes et informations en public (on m'a même accusé de faire cela pour me faire du fric sur le dos de Pod), mais Pod est remplit de bugs de gestion mémoire, de trucs bizarre, ... et on s'est dit que la seule façon d'éviter des bugs dans Pod était de garder un contrôle, de façon a vérifier que les règles 'anti-bug' sont respectées. C'est comme quand tu installe 60 circuits dans Pod, des fois ça passe, et d'autres fois ça plante, ca n'a pas été facile de déterminer que si ton pod plante au milieu de la course, c'est parce que tu as trop de circuits dans ta liste (cherchez le rapport). Ben pour l'ID du circuit, c'est le même, ainsi que la palette (au début, je recréais une palette en fonction de l'image, ce qui permettait même de créer une image avec d'autres couleurs que le vert, et celui qui faisait son image, ben il avait pas de bug, parce qu'il était déjà sur son circuit, donc c"était sa palette qui était lue et bien souvent, il ne passait pas vers les autres circuits. C'est quand il l'a passé à quelqu'un d'autre que l'on s'est rendu compte du bug. C'est comme la longeur de 8 caractères pour le nom de circuit. Pod accepte plus (Discover s'appelait d'ailleurs Discovery au début), mais le CDPatcher n'accepte pas plus de 8.
Ce que je veux dire par là, c'est que toutes les règles 'anti-bug' que l'on a, ce n'est absoluement pas pour ennuyer le gens, ce sont des règles que l'on s'est donnée après avoir détecté des bugs, et il y en a sans doute d'autres que l'on a pas encore décelée, comme les nouveaux circuits qui plantent par moment...
Skubidou:~