Почему, если вы откроете EXE в шестнадцатеричном редакторе, вы увидите все, что угодно. Если компьютеры понимают только двоичный код, то разве в файле не должно быть только 2 возможных символа? Спасибо
Почему EXE не в двоичном формате?
Ответы (8)
Шестнадцатеричные значения интерпретируются как двоичные значения в памяти. Программное обеспечение только делает его более читабельным для людей.
0000 = 0
0001 = 1
0010 = 2
0011 = 3
0100 = 4
0101 = 5
0110 = 6
0111 = 7
1000 = 8
1001 = 9
1010 = 10 A
1011 = 11 B
1100 = 12 C
1101 = 13 D
1110 = 14 E
1111 = 15 F
Вы путаете содержание с репрезентацией. Каждый отдельный файл на вашем компьютере может быть представлен в двоичном формате (единицы и нули), и именно так он обычно хранится на диске (выравнивание магнитных частиц) или в оперативной памяти (заряд).
Вы просматриваете исполняемый файл с помощью «шестнадцатеричного редактора», который представляет содержимое с помощью шестнадцатеричных чисел. Это происходит потому, что в шестнадцатеричном формате легче понимать и перемещаться по нему, чем в двоичном (сравните «FA» с «11111010»).
Таким образом, шестнадцатеричный символ «C0» представляет то же значение, что и двоичное «11000000», «C1» == «11000001», «C2» == «11000010» и так далее.
Компьютеры не понимают только двоичные файлы, это заблуждение. Да, на самом низком, самом низком, самом низком уровне данные в цифровых компьютерах представляют собой последовательность единиц и нулей. Но процессоры компьютеров группируют эти биты вместе в байты, слова, dwords, qwords и т. Д. Базовая единица, с которой имеет дело современный ЦП, - это двойное слово или двойное слово, а не бит. Вот почему их называют 32-битными или 64-битными процессорами. Если вы хотите заставить их работать с одним битом, вы в конечном итоге включите в него 31 или 63 посторонних бита. (Когда вы начинаете работать с регистрами флагов, это становится немного размытым.)
Цифровые компьютеры действительно стали 8-битными процессорами, поэтому шестнадцатеричный формат стал очень полезным форматом отображения, поскольку он кратко представляет байт (8 бит) в двух символах. Вы используете шестнадцатеричный редактор, поэтому он показывает шестнадцатеричный код, и из-за этой ранней байтовой ориентации он показывает два символа на каждые 8 бит. Хотя в основном это дисплей; мало причин, по которым он не может показать вам один символ на каждые 4 бита или четыре символа на каждые 16 бит, хотя файловые системы обычно работают с байтовой гранулярностью для фактических данных (и намного, гораздо более крупных фрагментов для гранулярности распределения хранилища - почти всегда 4k или больше).
Этот символ A
, который вы видите здесь, на экране, представляет собой всего лишь узор, состоящий из единиц и нулей. Это то, как мы все сотрудничаем в соответствии со всеми стандартами, которые делают понятными все единицы и нули, образующие рисунки на экране.
Символ A
может иметь значение 65. В двоичном формате это 0100 0001
, но на экране это может быть шаблон
##
# #
####
# #
# #
В exe-файле хранится много информации в различных форматах, с плавающей запятой, целыми числами и строками. Эти форматы часто используются, поскольку они могут быть легко прочитаны компьютером без дальнейшего преобразования. В шестнадцатеричном редакторе вы часто сможете читать строки, которые хранятся в exe-файле.
В компьютере все двоичное
Есть только два возможных состояния. То, что вы видите, - это более крупные комбинации их, почти так же, как предложения, состоящие из букв и знаков препинания.
Каждый символ (байт) в файле представляет 8 бит (8 единиц или нулей). Вы не видите биты, вы видите байты (и более крупные типы).
Итак, я собираюсь дать здесь ответ непрофессионала. То, что другие предложили выше, правильно, вы можете читать двоичный файл через представление Hex. В любом случае большая часть данных сохраняется в круглых байтах. Возможно, например, Алгоритм сжатия вычисляет сжатое представление в некотором нечетном количестве бит, но он все равно дополняет его до полного байта, чтобы сохранить его. И каждый байт может быть представлен как 8 бит или 2 шестнадцатеричные цифры.
Но, возможно, вы не об этом просили. Вполне вероятно, что вы нашли некоторые данные ascii внутри якобы двоичных данных. Почему? Что ж, иногда код нужен не только для выполнения. Иногда компиляторы включают некоторые биты данных, удобочитаемых человеком, которые могут помочь в отладке, если код выйдет из строя и вам понадобится доступ к трассировке стека. Такие вещи, как имена переменных, номера строк и т. Д.
Не то чтобы мне когда-либо приходилось это делать. В моем коде нет ошибок. Верно.
Не забывайте об операционной системе и файловой системе на диске. Они могут использовать файлы только в своих форматах. Например, исполняемые файлы в win32 должны начинаться с заголовка PE. Операционная система загружает exutable в память и управление передачей, сортирует api-инструкции в exutables и так далее ... Инструкции низкого уровня выполняются процессором, поскольку инструкции этого уровня уже могут быть наборами байтов.
A113
будут0x41 0x31 0x31 0x33
в необработанном шестнадцатеричном формате - person epatel   schedule 20.03.201041 31 31 33
в вашем примере). Иногда они также будут отображать содержимое, интерпретируемое как ASCII, с одной стороны, но это то, о чем здесь говорят. - person Michael Petrotta   schedule 20.03.20100x
). Все еще не понимаю. Он определенно не смотрит на символ ASCII, соответствующий этому значению. В шестнадцатеричном редакторе байт с десятичным значением 65 будет показан в шестнадцатеричном редакторе как41
, неA
. - person T.J. Crowder   schedule 20.03.2010strings
для поиска строк в двоичных файлах - мой редактор не зацикливается на непечатаемых символах. Я использую шестнадцатеричный редактор для чтения файлов в формате, отличном от ASCII. Опять же, я имел обыкновение предугадывать скорость подключения моего модема, слушая свистки, так что каждому свое. - person Michael Petrotta   schedule 20.03.2010