Открыл JPG картинку с блокнотом, вставил весь "текст" в новый файл Блокнота, поменял на.JPG и он больше не открывается. Почему?

этот феномен был оставив меня вопросы.

вот подробный эксперимент, моя ОС Windows 7 x64 SP1:

  • Я изменил файл изображения (JPG) на TXT, просто изменив его расширение (или можно просто открыть JPG с помощью блокнота, то же самое)

Это должно выглядеть так, странно выглядящие последовательности текстов, и некоторые из них (очень редкие) на самом деле имеют смысл, как на скриншоте ниже " creator: dg-jpeg В1.0..."

Sample JPG text

  • Я отключил перенос и выделил весь текст с помощью Ctrl+A (чтобы убедиться, что ничего не пропущено)
  • я вставил скопированный текст в другой пустой файл TXT и сохранил его как JPG, я сравнил новый размер файла с оригинальным JPG. Все они (оригинальный JPG, преобразованный файл TXT и недавно созданный файл TXT) имеют точно тот же размер, в байтах.

Когда Я пытался открыть, окна бы сказать "Средство просмотра фотографий Windows не удается открыть это изображение, поскольку файл поврежден или слишком велик".

Я даже пытался проверить его другим способом: открыл JPG блокнотом, вырезал ONE известный символ из места, которое легко запомнить (например, первый символ 2-й строки), затем сохраните файл. Зритель, конечно, будет отображать одно и то же сообщение. Затем я снова открыл его и вставил символ к точно местоположение (Блокнот запоминает свое состояние выхода, как положение windows, упаковка, размер шрифтов...так что у меня нет проблем с получением этого права)

и все та же ошибка. Вы можете попробовать это, чтобы получить идею, не забудьте выбрать небольшую картинку еще Блокнот будет действовать как старый ржавый человек.

Что может быть причиной этого явления?

1
задан Steven M. Vascellaro
19.12.2022 3:55 Количество просмотров материала 2649
Распечатать страницу

6 ответов

в зависимости от кодировки, используемой для открытия файла можно увидеть различное поведение. Мой блокнот Windows 7 позволяет открыть файл в ANSI, UTF-8, Unicode или Unicode big endian.

Я тестировал эту проблему с небольшим jpeg-изображением размером 2x2 пикселя, созданным с помощью gimp, и открывал и сохранял файл изображения с кодировкой ANSI. Открыв и оригинал, и сохраненное изображение в шестнадцатеричном редакторе, я вижу, что все 00 последовательностей (две шестнадцатеричные цифры,нулевой управляющий символ) были конвертируется в 20 (пробел).

замена обратно в шестнадцатеричном редакторе все 20 к 00 восстанавливает формат изображения.

я погуглил его немного, и я не нашел никаких ссылок, которые объясняют, почему он это делает. Только ссылка на сообщение, которое предупреждает об этом (ссылка на кэш google, страница недоступна).

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

Если вы сохраняете / открываете файл в Юникоде, кажется, что он все еще преобразует нулевые символы в пробелы, но также добавляет байт в начало файла,BOM.

80
отвечен mangper 2022-12-20 11:43

почему не получается:

Блокнот создать пробелы (ASCII code 32) символов вроде NUL (ASCII code 0) потому что текстовое поле Windows API допускает только завершенное значение null char * ASCIIZ (массив символов, указатель). он будет отрезан в первом нулю.

это происходит потому, что Windows API в основном написано C язык и строки, оканчивающиеся null одна из общих черт. Даже когда современные окна и Unicode считается же нуль терминированные строки происходят. Таким образом, Блокнот просто заменить их с пространством, так что вы можете просмотреть полный файл.

так что при сохранении файла он поврежден.

wikipedia - null терминированные строки


как сделать дополнительные исследования :

вы можете использовать компаратор как Beyond compare (коммерческая,пробная версия) чтобы увидеть эффект замены символов. Смотрите также другие инструменты бинарного сравнения.

hex comparison

Примечание : (20)16 = (32)10


причина Блокнот действует медленно на большие файлы

проверяет каждый символ и заменяет специальные символы пробелами. Другие программы не выполняют преобразования в памяти (по крайней мере, не примитивные, как notepad). Они просто отображают специальные символы по-разному. И они используют передовые методы буферизации.

глядя в блокнот.exe (XP 32 бит)

( Я предполагаю, что он все еще написан на C++ или, по крайней мере, использует сравнительно похожий линкер)

notepad

я использую Святого Джеймса, Грин инструмент (который остановил разработку с введением PE+ / 64 exes)

PEiD можно найти в комплекте в папке bin универсальный Extractor

я извлек Блокнот. ex_ файл из iso Windows xp очевидно. Попробовать ее. Это Cab-файл с использованием 7z.

предупреждение ! Ваш антивирусный сканер может обнаружить Universal Extractor / PEiD в качестве хакерских инструментов или вирусов. Не доверяйте ему не загружайте его !!


дополнительная информация о Windows API

благодарности:Jason C

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

36
отвечен Bhathiya Perera 2022-12-20 14:00

Блокнот не сохраняет все специальные / расширенные символы точно так, как они есть. У меня нет ссылки на это поведение сразу под рукой, но я обнаружил, что это так, например, с UNIX-style end of line LF, который Блокнот преобразует в CRLF и null (0x00), который он будет игнорировать. В двоичном файле, таком как JPG, могут быть случайные вхождения символов, которые Блокнот не сохраняет. Попробуйте свой эксперимент с шестнадцатеричным редактором, и он должен работать затем. Я обновлю свой ответ, если найду хорошую ссылку, и как только проверю шестнадцатеричный редактор.

Update: я попробовал несколько известных редакторов программистов, но только один из них работал сразу, HxD от Maël Hörz. Я никогда раньше не использовал HxD, но нашел его благодаря ответу на эту статью стека, плагин hex viewer / editor для Notepad++.

другие редакторы, которые не работали после нескольких минут усилий были Notepad++, Notepad2 и UltraEdit (v17.3, более старая версия). У некоторых из них были проблемы с копированием / вставкой первых нескольких байтов, JPEG магическое число подписи файла FF D8 FF. Может быть, они будут работать немного больше, чем у меня есть время на данный момент.

28
отвечен JohnC 2022-12-20 16:17

раньше вы могли сделать это с помощью Write back in the day. Это была стандартная программа в Windows 3.1, но я не могу вспомнить, включена ли она в Windows 95. Write позволит безопасно редактировать любой файл, который он может открыть (возможно, очень ограниченный размер файла). Блокнот определенно не является бинарно безопасным (текст остается тем же, но фактические байты нетекстовых символов [например, коды управления] могут измениться), поэтому ваш пример JPG не работает. Попробуйте получить копию Write (и очень старых Windows) и попробуйте еще раз!

по данным статья Википедии "Windows Write" запись была включена до Windows NT 3.5. Он был заменен Wordpad в Windows 95 и далее. write.exe все еще присутствовал в каталоге Windows, но был просто оболочкой для открытия Wordpad.

6
отвечен CJ Dennis 2022-12-20 18:34

Я думаю, что проблема не только в кодировке, но и в наборе символов. Формат JPG в основном представляет собой поток байтов. Таким образом, допуская непечатные символы, такие как нуль, ЕТХ, компании STX, сох, дле, и т. д.

Блокнот может не отображать непечатаемые символы. Он может отображать заполнители какого-то рода, как пробел для нулевого символа. Итак, открываем файл с помощью блокнота не показывают фактическое содержание, но содержание декодируются выбранной кодировке (UTF-8, UTF-16 и т. д.) и отображается определенным набором символов (unicode, ascii и т. д.), исключая непечатаемые символы.

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

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


обновление: Bhathiya Pereras ответ является правильным: https://superuser.com/a/782885/322784 Непечатаемые символы не игнорируются при копировании текста в буфер обмена.

5
отвечен sbecker 2022-12-20 20:51

файл JPEG содержит нетекстовые данные, за исключением некоторых полей, в основном любые байтовые значения от 0 до 255 будут найдены, особенно в области, представляющей закодированное сжатое изображение, которое содержит почти псевдослучайные данные.

но Блокнот будет рассматривать данные как текст ANSI по умолчанию, поэтому он будет делать различные вещи, которые изменят исходные данные, как:

  • заменить байты отображения специальных / неопределенных / запрещенных символов, поскольку они не делает смысл допустимого текста ANSI

  • re кодировать нулевые символы, конец строки и конец последовательности файлов в Windows / DOS конвенций

Это означает, что если вы редактируете и сохраняете данные в виде текста, это изменит jpeg в лучшем случае и сделает его непригодным для использования в худшем.

2
отвечен Dice9 2022-12-20 23:08

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх