Как да редактирате шестнадесетичната стойност на двоичен файл с помощта на C#

И така, ето моя проблем. Имам двоичен файл, който искам да редактирам. Разбира се, мога да използвам шестнадесетичен редактор, за да го редактирам, но трябва да направя програма, която да редактира този конкретен файл. Да кажем, че знам определен шестнадесетичен, който искам да редактирам, знам, че е адрес и т.н. Да кажем, че това е 16-битов двоичен файл и адресът е 00000000, той е на ред 04 и има стойност 02. Как мога да създам програма, която ще промени стойността на този шестнадесетичен и само този шестнадесетичен с едно щракване на бутон?

Намерих ресурси, които говорят за подобни неща, но не мога да намеря помощ за точния проблем.

Всяка помощ ще бъде оценена и моля, не просто ми казвайте отговора, ако има такъв, но се опитайте да обясните малко.


person JC Leyba    schedule 10.07.2010    source източник
comment
Правилно ли разбирам, че искате да презапишете няколко байта на дадено място във файл, който вече е на диска?   -  person    schedule 10.07.2010


Отговори (2)


Мисля, че това е най-добре обяснено с конкретен пример. Ето първите 32 байта от изпълним файл, както е показано в шестнадесетичния редактор на 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

Сега файлът наистина е просто линейна последователност от байтове. Редовете, които виждате в шестнадесетичен редактор, са само за да направят нещата по-лесни за четене. Когато искате да манипулирате байтовете във файл с помощта на код, трябва да идентифицирате байтовете чрез техните позиции, базирани на 0. В горния пример позициите на ненулевите байтове са както следва:

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

В шестнадесетичния редактор, показан по-горе, числата отляво представляват позициите на първия байт в съответния ред. Редакторът показва 16 байта на ред, така че те се увеличават с 16 (0x10) на всеки ред.

Ако просто искате да вземете един от байтовете във файла и да промените стойността му, най-ефективният подход, който виждам, би бил да отворите файла с помощта на FileStream, да потърсите подходящата позиция и да презапишете байта. Например, следното ще промени 0x40 на позиция 24 на 0x04:

using (var stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite)) {
    stream.Position = 24;
    stream.WriteByte(0x04);
}
person Nick Guerrera    schedule 10.07.2010
comment
Благодаря ви много, успях да завърша програмата си с тази информация. - person JC Leyba; 10.07.2010

Е, първото нещо вероятно ще бъде да разберем преобразуванията. Шестнадесетичен в десетичен вероятно не е толкова важен (освен ако разбира се не трябва първо да промените стойността от десетичен, но това е проста формула за преобразуване), но шестнадесетичен в двоичен ще бъде важен, тъй като всеки шестнадесетичен знак (0-9,A-F ) съответства на конкретен двоичен изход.

След като разберете тези неща, следващата стъпка е да разберете какво точно търсите, да направите правилното преобразуване и да замените точния низ. Бих препоръчал (ако буферът не е твърде голям) да вземете целия шестнадесетичен дъмп и да замените каквото и да търсите там, за да избегнете презаписването на дублирана двоична последователност.

Надявам се това да помогне!

Поздрави,
Денис М.

person RageD    schedule 10.07.2010