Мне было скучно и я решил попробовать этот эксперимент:

Я изменил расширение exe на txt и скопировал содержимое. Все было перемешано со случайными символами. Затем я скопировал его в другой текстовый файл и переименовал этот текстовый файл в exe. В запуске этого exe я получил:

Размеры как исходного, так и скопированного exe-файла были одинаковыми. Так почему же это не работает? Есть ли объяснение этому? И есть ли лучший способ (сначала преобразовав его в текст)?

Надеюсь, это имеет смысл?

2 ответа2

2

Перенос любых двоичных данных через произвольный текстовый редактор приведет к неопределенным и потенциально вредным изменениям в файле, аналогично использованию "текстового" режима FTP-передачи для передачи двоичного файла.

Per Что такое формат ANSI?

Использование символов верхнего набора битов не определено в ASCII/ANSI, так как это 7-битный набор символов.

Так что, если вы используете текстовый редактор ANSI, вы, вероятно, удалите верхний бит каждого байта и повредите файл. У вас будет такое же количество байтов, поэтому размер файла будет таким же, но вам не хватит 1/8 данных, необходимых для работы исполняемого файла.

Умные текстовые редакторы могут хранить все данные, пока вы сохраняете их как что-то вроде UTF-8 (без спецификации), но я, не пытаясь сделать это, не стал бы доверять их двоичным данным.

Гораздо проще скопировать и вставить файл надлежащим образом, используя процедуру копирования Explorer (или ее эквивалент), поскольку это будет точная копия, а не текстовый редактор.

1

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

Непечатаемые символы: наборы символов ASCII (и Unicode) определяют сопоставления чисел (групп двоичных данных) с символами. (На самом деле существует множество наборов символов, но UTF-8 и UTF-16, вероятно, являются наиболее распространенными, и оба, в некоторой степени, основаны на ASCII; так же, как и большинство других.) Однако не все числа соответствуют "реальным" символам. Некоторые из них являются "управляющими" персонажами, предназначенными для использования на таких вещах, как действительно древние машины удаленного телетайпа. Некоторые странные вещи, например, символ "колокольчик" (который издает звуковой сигнал, если вы печатаете его на консоли). Также есть символ NULL (хранится как 0, все биты не установлены), который используется для обозначения конца строки (капли текста) во многих языках программирования; текстовые редакторы, вероятно, не будут обрабатывать их изящно, но они появятся в исполняемом файле.

Во всяком случае, текстовый редактор не будет знать, как их представить. Он может просто показывать их в виде квадратов или чего-то еще, но затем, когда вы копируете его, он может копировать символы в виде квадратов, а не в качестве их базовых кодов символов. Или когда вы вставляете это, это может сделать что-то подобное. Поскольку EXE-файлы состоят из машинного кода (двоичные данные, которые не предназначены для представления в виде текста), они будут содержать набор этих непечатаемых символов.

Окончания строк: есть два символа, которые (иногда) используются для окончания строк в большинстве наборов символов. Это возврат каретки (в старом телетайпе это означало "переместить печатающую головку назад к левому краю") и перевод строки (переход к следующей строке вниз на странице). Смотрите Википедию. Windows использует оба, как правило, парные; если строка не заканчивается в CRLF, некоторые редакторы сочтут, что строка вообще не заканчивается, и просто поместят невидимый символ (вы "запутаетесь" над ним, если будете использовать клавиши со стрелками для перемещения влево / правильно, ваш курсор будет казаться не двигаться). Другие редакторы будут обрабатывать только CRLF, LF или даже CR (хотя ничего, поскольку классический MacOS использовал это окончание строки) все как допустимые окончания строки.

Проблема возникает, когда вы копируете-вставляете что-то с несовместимым окончанием строки. Многие текстовые редакторы достаточно "умны", чтобы "исправить" окончания строк. В системе Windows это, вероятно, означает преобразование всех соло LF и, возможно, также соло CR, в комбинации CRLF. Это добавление новых данных в EXE, что, конечно, меняет значение машинного кода.

Как говорится в комментарии @ Ramhound, если вы хотите скопировать и вставить содержимое EXE-файла (или любого другого нетекстового двоичного файла), вам необходимо использовать бинарный редактор (большинство из них обычно называются шестнадцатеричными редакторами, поскольку байт в файле как шестнадцатеричное значение, от 00 до FF, хотя они также будут декодировать печатаемые в текст для вас). Бинарные редакторы не пропустят непечатаемые символы или попытаются "исправить" окончания строк или что-то еще в этом роде.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .