Почему EXE не бинарные? - PullRequest
       24

Почему EXE не бинарные?

9 голосов
/ 20 марта 2010

Почему, если вы откроете EXE в шестнадцатеричном редакторе, вы увидите все что угодно. Если компьютеры понимают только двоичный код, тогда в файле не должно быть только 2 возможных символа? Спасибо

Ответы [ 8 ]

31 голосов
/ 20 марта 2010

Вы путаете контент с представлением. Каждый отдельный файл на вашем компьютере может быть представлен в двоичном виде (1 с и 0 с), и именно так он обычно хранится на диске (выравнивание магнитных частиц) или ОЗУ (заряд).

Вы просматриваете свой exe-файл в «шестнадцатеричном редакторе», который представляет контент, используя шестнадцатеричные числа . Это происходит потому, что легче понять и перемещаться по шестнадцатеричному, чем двоичному (сравните «FA» с «11111010»).

Таким образом, шестнадцатеричный символ "C0" представляет то же значение, что и двоичный файл "11000000", "C1" == "11000001", "C2" == "11000010" и т. Д.

15 голосов
/ 20 марта 2010

Шестнадцатеричные значения интерпретируются двоичными значениями в памяти. Программное обеспечение только делает его немного более читабельным для людей.

0000 = 0
0001 = 1
0010 = 2
0011 = 3
0100 = 4
0101 = 5
0110 = 6
0111 = 7
1000 = 8
1001 = 9
1010 = 10
1011 = 11 B
1100 = 12 С
1101 = 13 D
1110 = 14 E
1111 = 15 F

7 голосов
/ 20 марта 2010

Компьютеры не понимают только двоичный код, это заблуждение. На уровне очень низкий, самый низкий, самый низкий , да, данные в цифровых компьютерах представляют собой последовательность из 1 и 0. Но компьютерные процессоры группируют эти биты в байты, слова, dwords, qwords и т. Д. Базовая единица, используемая в современном CPU, - это слово или слово, а не бит. Вот почему они называются 32-битными или 64-битными процессорами. Если вы хотите, чтобы они работали с одним битом, вы в конечном итоге включили в него 31 или 63 посторонних бита. (Становится немного размыто, когда вы начинаете работать с регистрами флагов.)

Цифровые компьютеры действительно появились как 8-разрядные процессоры, поэтому шестнадцатеричный формат стал очень полезным форматом display , поскольку он кратко представляет байт (8 бит) в двух символах. Вы используете шестнадцатеричный редактор, поэтому он показывает вам шестнадцатеричный код, и из-за ранней ориентации байтов он показывает два символа на каждые 8 ​​бит. Хотя, в основном это вещь для показа; есть небольшая причина, по которой он не может показывать вам один символ на каждые 4 бита или четыре символа на каждые 16 бит, хотя файловые системы обычно работают с гранулярностью байтов для фактических данных (и гораздо, гораздо большими кусками для гранулярности выделения хранилища - почти всегда 4 Кб) или больше).

2 голосов
/ 20 марта 2010

Этот символ A, который вы видите здесь на экране, является просто шаблоном, состоящим из единиц и нулей. Это то, как мы все сотрудничаем по всем стандартам, благодаря чему все единицы и нули делают шаблоны, попадающие на экран, понятными.

Символ A может иметь значение 65. В двоичном виде это 0100 0001, но на экране это может быть шаблон

   ##
  #  #
  ####
  #  #
  #  #

В исполняемом файле много вещей хранится в различных форматах, числах с плавающей запятой, целых числах и строках. Эти форматы часто используются, поскольку они легко читаются непосредственно компьютером без дальнейшей конвертации. В шестнадцатеричном редакторе вы часто сможете читать строки, которые хранятся в исполняемом файле.

В компьютере все двоично

1 голос
/ 20 марта 2010

Есть только два возможных состояния. То, что вы видите, - это более крупные комбинации их комбинаций, во многом так же, как из предложений состоят только буквы и знаки препинания.

1 голос
/ 20 марта 2010

Каждый символ (байт) в файле представляет 8 бит (8 единиц или ноль). Вы не видите биты, вы видите байты (и более крупные типы).

0 голосов
/ 20 марта 2010

Так что я собираюсь дать ответ непрофессионала здесь. То, что другие предложили выше, является правильным, вы можете прочитать двоичное через шестнадцатеричное представление. В любом случае большинство данных сохраняется в круглом количестве байтов. Возможно, например, что Алгоритм сжатия вычисляет сжатое представление в некотором нечетном количестве битов, но все равно добавляет его в полный байт, чтобы сохранить его. И каждый байт может быть представлен как 8 бит или 2 шестнадцатеричных цифры.

Но это может быть не то, что вы просили. Вполне вероятно, что вы нашли некоторые данные ASCII внутри предположительно двоичные данные. Зачем? Ну, иногда код не только для запуска. Иногда компиляторы включают в себя некоторые биты данных, читаемых человеком, которые могут помочь при отладке, если код сбой, и вам нужно было получить доступ к трассировке стека. Такие вещи, как имена переменных, номера строк и т. Д.

Не то чтобы я когда-либо делал это. У меня нет ошибок в моем коде. Это верно.

0 голосов
/ 20 марта 2010

Не забывайте об операционной системе и файловой системе. Они могут использовать файлы только в своих форматах. Например, исполняемые файлы в win32 должны начинаться с PE-заголовка. Операционная система загружает exutable в память и управление передачей, сортирует api-инструкции в exutables и т. Д. ... Команды низкого уровня выполняются CPU, для инструкций этого уровня уже может быть набор байтов.

...