Я думаю, что это лучше всего объяснить на конкретном примере.Вот первые 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
Теперь файл представляет собой просто линейную последовательность байтов.Строки, которые вы видите в шестнадцатеричном редакторе, предназначены только для упрощения чтения.Если вы хотите манипулировать байтами в файле с помощью кода, вам необходимо идентифицировать байты по их позициям, начинающимся с нуля.В вышеприведенном примере позиции ненулевых байтов следующие:
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);
}