Bonjour,

Je trouve que cette discussion traîne en longueur, et pourtant c'est assez simple.
Alors je vais faire un gros effort didactique... pour aider les novices à comprendre ce qu'est la représentation hexadécimale des données d'un fichier, comment est visualisé un fichier sous cette représentation et comment lire/écrire dans un fichier à l'aide de cette représentation.


Pour commencer, j'ai annoté la représentation hexadécimale du fragment de fichier qui sert d'exemple dans cette discussion.


1. Des paquets d'octets
Par convention, la représentation hexadécimale des octets d'un fichier se fait par "paquets d'octets".
Dans le cas présent, il s'agit de paquets de 16 octets listés horizontalement et séparés par un caractère espace.
Pour des raisons pratiques, la valeur de chaque octet est donnée en base 16 (hexadécimale) et non pas en base 10 (décimale).

2. Adresse d'un octet
Afin de replacer chaque paquet d'octets dans l'espace d'adressage du fichier, on précise l'adresse de base du paquet d'octets.
L'adresse de base d'un paquet d'octets est l'adresse de son premier octet, relativement au début du fichier.
L'adresse des autres octets est obtenue en ajoutant un rang de décalage (ou offset en anglais) à l'adresse de base.
Pour un paquet de 16 octets, le décalage sera donc compris entre 0 et 15 (ou 00 à 0F, en notation hexadécimale).
N.B. L'adresse du premier octet d'un fichier est 0.
Par convention, adresse de base et décalage sont aussi notés en hexadécimal, et c'est assez pratique à utiliser (une fois habitué ).

Pour déterminer la position d'un octet pour lequel on connaît (1) l'adresse de base et (2) un décalage (offset), il suffit d'en faire la somme.
Avec un décalage compris entre 0 et 15 c'est très simple en notation hexadécimale.

Code Addition hexadécimale : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
     Adresse de base        00DBC0         00DBD0
+           Décalage      +     03       +     0E
--------------------      --------       --------
= Adresse de l'octet      = 00DBC3       = 00DBDE

3. Conversion. Notation hexadécimale
Si l'adresse et le décalage sont donnés en base hexadécimale, alors il est nécessaire de les convertir, au tout au moins de les traiter en tenant compte de la base.

Pour la conversion, on peut:
* utiliser la calculatrice de Windows (affichage Scientifique);
* convertir à la volée avec la fonction WLangage Val().

Pour tenir compte de la base hexadécimale, on doit:
* utiliser directement la notation hexadécimale des valeurs numériques, comme le permet le WLangage.

La notation hexadécimale d'une valeur numérique est préfixée par "0x".
Par exemple, la valeur décimale 255 est notée 0xFF.

(Concernant la notation hexadécimale, je n'ai rien trouvé dans l'aide en ligne de WinDev )

4. Exemple complet
Dans cet exemple, j'ai choisi d'utiliser un Buffer pour y reporter la valeur (les valeurs ?) à écrire dans le fichier.
J'ai aussi choisi d'utiliser une notation hexadécimale, pour l'adresse de base, pour le décalage et pour la valeur à écrire.

Les fonctions WLangage utilisées ont déjà été vues dans les messages précédents.
Citation Envoyé par bombseb Voir le message
il faut utiliser :
  • fOuvre() pour ouvrir le fichier,
  • fPositionne() pour se déplacer à l'adresse souhaitée,
  • puis fEcrit()
  • et fFerme ()

rien de bien compliqué quoi...
Bien sûr ce code est à adapter.
Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
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
PROCEDURE EcrireDansFichier()

nIdFichier est un entier
bData est un Buffer 

nBase est un entier = 0xDBD0
nDécalage est un entier = 0x0E
nAdresse est un entier = nBase + nDécalage

// Valeur à écrire
bData[[1]] = 0x37

// Ouvrir le fichier
nIdFichier = fOuvre("C:\fichier.txt", foLectureEcriture)

SI nIdFichier=-1 ALORS
	Erreur("L'ouverture du fichier a échoué", ErreurInfo())
SINON
	// Positionner le fichier à l'adresse nAdresse
	fPositionne(nIdFichier, nAdresse, fpDébut)

	// Écrire le premier octet contenu dans bData
	fEcrit(nIdFichier, bData, 1)

	// Fermer le fichier
	fFerme(nIdFichier)
FIN

Remarque:
Le problème initial consistait à modifier plusieurs octets dans un fichier.
Je préconise de lire un bloc d'octets contenant tous les octets à modifier.
Ce bloc est écrit dans une variable de type Buffer.
Ensuite, les données du Buffer peuvent être librement modifiées.
Enfin, les données du Buffer sont écrites dans le fichier, par dessus les anciennes données.

Lien:
Le système hexadécimal: http://fr.wikipedia.org/wiki/Hexad%C3%A9cimal
_