Почему EXE не в двоичном формате?

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


person jmasterx    schedule 19.03.2010    source источник
comment
Потому что вы открыли его с помощью HEX-редактора - значит, он в HEX. Откройте его с помощью двоичного редактора, и вы получите свои любимые нули и единицы.   -  person Billy ONeal    schedule 20.03.2010
comment
Я не понимаю, почему люди не голосуют против этого. Распространенная ошибка - неправильно понимать контент и то, как он представлен. Тот факт, что вы считаете вопрос тривиальным, не делает его менее серьезным.   -  person GManNickG    schedule 20.03.2010
comment
Я думаю, вы имеете в виду отображение ascii в шестнадцатеричном редакторе. Не многие поймут сырые HEX, я полагаю   -  person epatel    schedule 20.03.2010
comment
@Gman: согласен, есть несколько подлых людей, бродящих по этому сайту, которые голосуют против без всякой видимой причины, кроме как для подлости.   -  person Todd Main    schedule 20.03.2010
comment
@epatel: Что же тогда будет за необработанный HEX?   -  person T.J. Crowder    schedule 20.03.2010
comment
@Otaku: изменения витают в воздухе: blog.stackoverflow.com/2010/03/ после того, как вы подали 300 голосов, вы не можете голосовать против постов, не принадлежащих сообществу, в соотношении более 2: 1   -  person Michael Petrotta    schedule 20.03.2010
comment
@ T.J Crowder Hex часто записывается как 0xnn, т.е. 0x12 для значения 18 (десятичное). Строки, хранящиеся в ascii, т.е. A113 будут 0x41 0x31 0x31 0x33 в необработанном шестнадцатеричном формате   -  person epatel    schedule 20.03.2010
comment
@ Майкл: Интересно. Из блога: поймите, что это повлияет на очень и очень небольшое количество пользователей - порядка 6 пользователей из 100 000+ в Stack Overflow Итак, это ... 9 пользователей. stackoverflow.com/users Вау, это нацелено. Тем не менее, возможно, это хорошая идея.   -  person T.J. Crowder    schedule 20.03.2010
comment
@epatel: Ваше различие упускает из виду. Шестнадцатеричные редакторы файлов отображают необработанное шестнадцатеричное значение файла (41 31 31 33 в вашем примере). Иногда они также будут отображать содержимое, интерпретируемое как ASCII, с одной стороны, но это то, о чем здесь говорят.   -  person Michael Petrotta    schedule 20.03.2010
comment
@epatel: И это то, что он увидит в шестнадцатеричном редакторе (без постороннего и зависящего от языка префикса 0x). Все еще не понимаю. Он определенно не смотрит на символ ASCII, соответствующий этому значению. В шестнадцатеричном редакторе байт с десятичным значением 65 будет показан в шестнадцатеричном редакторе как 41, не A.   -  person T.J. Crowder    schedule 20.03.2010
comment
@Michael Petrotta Вы читали мой комментарий, который я опубликовал за 18 минут до вашего?   -  person epatel    schedule 20.03.2010
comment
@epatel: Верно, что многие (не все) шестнадцатеричные редакторы также показывают ASCII в стороне.   -  person T.J. Crowder    schedule 20.03.2010
comment
@ T.J. Crowder Гекседиторы, которые я использовал, всегда отображали память как ascii, часто справа от шестнадцатеричных значений.   -  person epatel    schedule 20.03.2010
comment
@epatel: Я не читал достаточно внимательно. Итак, вы называете 41 31 31 33 необработанный гекс? Держу пари, никто здесь не использует шестнадцатеричный редактор для просмотра его интерпретации ASCII. Их точка - необработанное шестнадцатеричное отображение.   -  person Michael Petrotta    schedule 20.03.2010
comment
@Michael Petrotta Я часто использую hexeditor для поиска строк ascii в двоичных файлах. Для этого в emacs есть даже hexl-режим. Я бы никогда не стал читать шестнадцатеричные значения и пытаться что-то выяснить. Я бы даже написал свой собственный инструмент run'n'throwaway, чтобы получать полезные данные из двоичного файла. Хотите простой в использовании фрагмент кода hexdump? stackoverflow.com/questions/ 29242 / готовый-шестнадцатеричный-дамп-код / ​​   -  person epatel    schedule 20.03.2010
comment
@epatel: Достаточно честно. Я использую текстовый редактор или strings для поиска строк в двоичных файлах - мой редактор не зацикливается на непечатаемых символах. Я использую шестнадцатеричный редактор для чтения файлов в формате, отличном от ASCII. Опять же, я имел обыкновение предугадывать скорость подключения моего модема, слушая свистки, так что каждому свое.   -  person Michael Petrotta    schedule 20.03.2010


Ответы (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

person Klaim    schedule 19.03.2010
comment
Хорошо, тогда на самом деле есть еще 8 * вещей, просто он создает ascii и там шестнадцатеричную версию двоичного файла? - person jmasterx; 20.03.2010
comment
Нет, обычно байт будет представлен двумя шестнадцатеричными значениями (4 бита в шестнадцатеричный символ), которые можно напрямую преобразовать в двоичное. Преобразование в ASCII приведет к тому, что многие значения не могут быть отображены, кроме того, это не будет в HEX ... - person Chris Thompson; 20.03.2010
comment
@ user146780: каждая шестнадцатеричная цифра соответствует четырем двоичным битам. Это двухзначное значение байта. Например, код ASCII для верхнего регистра J - 4A. Большинство шестнадцатеричных редакторов также будут отображать печатаемые символы, если они присутствуют в коде. - person Max E.; 20.03.2010

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

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

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

person Michael Petrotta    schedule 19.03.2010

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

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

person T.J. Crowder    schedule 19.03.2010

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

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

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

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

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

person epatel    schedule 19.03.2010

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

person Ignacio Vazquez-Abrams    schedule 19.03.2010

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

person UncleBens    schedule 19.03.2010
comment
За исключением случаев отображения в шестнадцатеричном представлении, как в вопросе, каждая шестнадцатеричная цифра представляет 4 бита двоичного файла. - person Clifford; 20.03.2010

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

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

Не то чтобы мне когда-либо приходилось это делать. В моем коде нет ошибок. Верно.

person Nikola Jevtic    schedule 19.03.2010
comment
Это самый сбивающий с толку и вводящий в заблуждение ответ на этот фундаментальный вопрос, который я когда-либо видел. - person Jonathon Reinhart; 21.03.2013

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

person Victor    schedule 19.03.2010
comment
Это не то, о чем спрашивает ОП. - person Jonathon Reinhart; 21.03.2013