2010-07-10 8 views
9

Oto mój problem. Mam plik binarny, który chcę edytować. Mogę oczywiście edytować za pomocą edytora szesnastkowego, ale muszę stworzyć program do edycji tego konkretnego pliku. Powiedzmy, że znam pewien hex, który chcę edytować, wiem, że to adres itp. Powiedzmy, że jest to 16-bitowy plik binarny, a adres to 00000000, jest w wierszu 04 i ma wartość 02. Jak mogę utworzyć program, który zmieniłby wartość tego heksa i tylko ten heks za pomocą kliknięcia przycisku?Jak edytować wartość szesnastkową pliku binarnego za pomocą C#

Znalazłem zasoby, które mówią o podobnych rzeczach, ale nie mogę dla mojego życia znaleźć pomocy w tej kwestii

Każda pomoc będzie doceniona, i proszę nie udzielaj mi odpowiedzi, jeśli taka istnieje, ale spróbuj ją trochę wyjaśnić.

+0

Dostanę to correclty że chcesz zastąpić kilka bajtów w danym miejscu już w pliku na dysku? –

Odpowiedz

21

myślę, że to jest najlepszy wyjaśnił z konkretnym przykładzie. Oto pierwsze 32 bajtów pliku wykonywalnego jak pokazano w hex edytora 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 

Teraz plik jest naprawdę tylko liniowy ciąg bajtów. Wiersze widoczne w edytorze szesnastkowym służą tylko ułatwieniu czytania. Kiedy chcesz manipulować bajtami w pliku za pomocą kodu, musisz zidentyfikować bajty według ich pozycji opartych na 0. W powyższym przykładzie, położenia niezerowych bajtów są następujące:

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

w reprezentacji edytora heks przedstawionego powyżej, liczby po lewej reprezentują pozycje pierwszego bajtu w odpowiedniej linii. Edytor pokazuje 16 bajtów na linię, więc zwiększa się o 16 (0x10) w każdej linii.

Jeśli chcesz po prostu wziąć jeden z bajtów w pliku i zmienić jego wartość, najbardziej efektywnym sposobem, jaki widzę, byłoby otwarcie pliku przy użyciu FileStream, szukanie w odpowiedniej pozycji i nadpisanie bajtu. Na przykład, co następuje zmieni 0x40 w pozycji 24 do 0x04:

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

Dziękuję bardzo, udało mi się ukończyć mój program z tymi informacjami. –

0

Cóż, pierwszą rzeczą byłoby prawdopodobnie zrozumienie konwersji. Hex do dziesiętnego prawdopodobnie nie jest tak ważny (chyba że musisz najpierw zmienić wartość z dziesiętnej, ale jest to prosta formuła konwersji), ale szesnastkowy na binarny będzie ważny jako każdy znak heksadecymalny (0-9, AF) odpowiada konkretnemu wyjściu binarnemu.

Po zrozumieniu tych rzeczy, następnym krokiem jest znalezienie dokładnie tego, czego szukasz, dokonanie właściwej konwersji i zastąpienie dokładnego ciągu znaków. Polecam (jeśli bufor nie byłby zbyt duży), aby pobrać cały zrzut heksadecymalny i zastąpić to, czego szukasz, aby uniknąć nadpisania duplikowanej sekwencji binarnej.

Nadzieję, że pomaga!

Pozdrawiam,
Dennis M.

Powiązane problemy