2010-07-10 27 views
9

Alors, voici mon problème. J'ai un fichier binaire que je veux éditer. Je peux utiliser un éditeur hexadécimal pour l'éditer bien sûr, mais je dois créer un programme pour éditer ce fichier particulier. Dites que je connais un certain hexagone que je veux éditer, je sais que c'est l'adresse etc. Disons que c'est un binaire 16 bits, et l'adresse est 00000000, c'est sur la rangée 04 et elle a une valeur de 02. Comment pourrais-je créer un programme qui changerait la valeur de cet hex, et seulement cet hex avec le clic d'un bouton?Comment modifier la valeur hexadécimale d'un fichier binaire en utilisant C#

J'ai trouvé des ressources qui parlent de choses similaires, mais je ne peux pas pour la vie de moi trouver de l'aide avec le problème exact.

Toute aide serait appréciée, et s'il vous plaît, ne me dites pas simplement la réponse s'il y en a une mais essayez d'expliquer un peu.

+0

-je l'obtenir correclty que vous voulez écraser quelques octets à un endroit donné dans un fichier déjà sur le disque? –

Répondre

21

Je pense que cela est mieux expliqué avec un exemple précis. Voici les 32 premiers octets d'un fichier exécutable comme indiqué dans l'éditeur hexadécimal de Visual Studio:

00000000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 
00000010 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 

maintenant un fichier est vraiment juste une séquence linéaire d'octets. Les lignes que vous voyez dans un éditeur hexadécimal sont juste là pour rendre les choses plus faciles à lire. Lorsque vous voulez manipuler les octets dans un fichier en utilisant du code, vous devez identifier les octets par leurs positions basées sur 0. Dans l'exemple ci-dessus, les positions des octets non nuls sont les suivantes:

Position Value 
-------- ------ 
    0  0x4D 
    1  0x5A 
    2  0x90 
    4  0x03 
    8  0x04 
12  0xFF 
13  0xFF 
16  0xB8 
24  0x40 

Dans la représentation éditeur hexadécimal représenté ci-dessus, les nombres sur la gauche représentent les positions du premier octet dans la ligne correspondante. L'éditeur affiche 16 octets par ligne, donc ils augmentent de 16 (0x10) à chaque ligne.

Si vous voulez simplement prendre l'un des octets dans le fichier et changer sa valeur, l'approche la plus efficace que je vois serait d'ouvrir le fichier en utilisant un FileStream, chercher à la position appropriée, et écraser l'octet. Par exemple, ce qui suit va changer la 0x40 à la position 24 à 0x04:

using (var stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite)) { 
    stream.Position = 24; 
    stream.WriteByte(0x04); 
} 
+0

Merci beaucoup, j'ai pu compléter mon programme avec cette information. –

0

Eh bien, la première chose serait probablement de comprendre les conversions. Hex à décimal n'est probablement pas aussi important (à moins bien sûr que vous deviez changer la valeur d'une décimale en premier, mais c'est une simple formule de conversion), mais hexa à binaire sera important vu que chaque caractère hexadécimal (0-9, AF) correspond à une sortie binaire spécifique. Après avoir compris cela, l'étape suivante consiste à déterminer exactement ce que vous recherchez, à effectuer la conversion appropriée et à remplacer cette chaîne exacte. Je recommanderais (si le tampon ne serait pas trop grand) de prendre l'intégralité du vidage hexadécimal et de remplacer tout ce que vous recherchez pour éviter d'écraser une séquence binaire en double.

Espérons que ça aide!

Cordialement,
Dennis M.