Каков вывод 'кошки image.png'?

Что означает вывод, когда Вы делаете cat image.png?

Это то, из чего на самом деле сделано изображение?

Имеет значение, какое расширение файла изображение имеет?

4
задан 20 August 2019 в 00:35

3 ответа

cat распечатает содержимое файла (нули и единицы, которые будут сопоставлены с бессмысленными символами, потому что они на самом деле не символы, верно?) В stdout , который по умолчанию является вашим терминал.

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

Используйте файл file.png , чтобы получить тип файла, или xxd file.png :

00000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452  .PNG........IHDR
00000010: 0000 0002 0000 0002 0800 0000 0057 dd52  .............W.R
00000020: f800 0000 0e49 4441 5478 9c63 6c60 6062  .....IDATx.cl``b
00000030: 6000 0002 9200 84f7 7ca3 5800 0000 0049  `.......|.X....I
00000040: 454e 44ae 4260 82                        END.B`.

, чтобы получить шестнадцатеричный дамп содержимого файла, обратите внимание на «PNG» в первой строке.

Также из этой ссылки на сигнатуры файлов мы видим, что сигнатура PNG имеет вид:

PNG     89 50 4E 47 0D 0A 1A 0A     PNG image
12
ответ дан 17 November 2019 в 09:08

Изображения состоят из байтов. То же самое и с текстовыми файлами

. Когда программное приложение, например cat , хочет читать текстовые файлы, оно начинает чтение байтов и ищет эти байты в кодировках символов, таких как ascii или unicode. Он находит символ в таблице и отображает его.

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

Если вы хотите увидеть строки файла, используйте команду strings .

3
ответ дан 17 November 2019 в 09:08

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

Рассмотрим, например, cat файл, содержащий символы UTF, например китайский язык, на двух разных терминалах - один из которых поддерживает символы UTF (терминатор на снимке экрана ниже) и тот, у которого нет хорошей поддержки ( xterm на скриншоте ниже). Как видите, некоторые символы не интерпретируются. cat будет выводить содержимое в любом случае, но как интерпретировать это содержимое - это зависит от каждого терминала.

enter image description here

Теперь, если вы перенаправляете поток stdout в файл, вы эффективное создание копии, почти такой же, как cp original copy или mv old new . В некоторых редких случаях вам может понадобиться соединить два файла - двоичный или текстовый - что также возможно с помощью cat . Идея та же. В соответствии с определением POSIX , «[t] входные файлы могут быть любого типа», что означает, что cat может читать любой файл. Однако в некоторых случаях cat будет использовать текстовый режим. В случае Ubuntu cat (который предоставляется пакетом GNU coreutils) информация, представленная в info cat , гласит:

'cat' читает в текстовом режиме, если один из вариантов '- bensAE 'или если' кошка ' читает со стандартного ввода, а стандартный ввод - это терминал. Точно так же cat пишет в текстовом режиме, если одна из опций «-bensAE» или если стандартный вывод - это терминал.

Конечно, если мы действительно хотим просмотреть содержимое двоичного файла в читаемом формате, мы можем использовать шестнадцатеричные редакторы или программу любого типа «дамп», Midnight Commander ] файловый менеджер или даже текстовый редактор vi . Там уже есть неплохой список здесь и здесь .

9
ответ дан 17 November 2019 в 09:08

Другие вопросы по тегам:

Похожие вопросы: