Что получается после использования кота на изображении?

9

Допустим, каждый создает файл примерно так:

touch myFile

Вы вводите в него какой-то текст с помощью vim или чего-то еще, а затем используете cat myFileдля выплевывания содержимого в терминал.

Теперь, что происходит, когда я использую кошку на любом изображении? Сказать,

cat myPNG.png

Я просто получил кучу мусора. Это просто заставило меня задуматься о том, что catкоманда пытается сделать, и откуда весь этот «мусор». Просто любопытно.

QCOM
источник

Ответы:

22

Может быть полезно объяснить, как файлы работают на самом низком уровне:

Файл представляет собой поток байтов нулевой или более длины. Байт 8 бит. Поскольку существует 256 комбинаций из 8 битов, это означает, что байт - это любое число от 0 до 255. Таким образом, каждый файл на самом низком уровне представляет собой большой массив чисел в диапазоне от 0 до 255.

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

Конечно, для графики мы, вероятно, хотим, чтобы числа представляли пиксели и их цвета. Затем нам понадобится программа, которая просматривает файл, читает все байты и соответственно отображает изображение. Эмулятор терминала ожидает, что байты будут номерами ASCII / Unicode и будет вести себя по-разному, для одного и того же фрагмента байтов (или файла).

LawrenceC
источник
Отличное объяснение! Рад, что вы спустились на самый низкий уровень.
Qcom
2
@ БОСС Я бы добавил немного определения. Бит - это двоичная цифра или число, которое может быть единицей или нулем. Один бит имеет две возможности или 2 ^ 1 = 2. Два бита могут иметь четыре комбинации или 2 × 2 = 4. Вернее, это 2² = 4 для 2 цифр. 8 двоичных цифр или битов могут иметь 2 ^ 8 = 2 × 2 × 2 × 2 × 2 × 2 × 2 × 2 = 256 возможных комбинаций.
penguin359
2
Незначительный задира / педантизм: байт имеет произвольный размер. Вы можете столкнуться с ситуациями, когда ширина не равна 8 битам. «Октет» является предпочтительной терминологией.
Крис Даун
9

Cat выводит содержимое входного файла на стандартный вывод, который в данном случае представляет собой текстовое устройство: окно вашего терминала. Поскольку изображение состоит из двоичных данных, вы видите необработанные двоичные данные, интерпретируемые как текст ASCII. Например, байт со значением 65 будет отображаться в верхнем регистре A, 66 в верхнем регистре B и т. Д. Если вы откроете файл с помощью приложения, способного правильно интерпретировать файл изображения, двоичное содержимое файла будет отображаться как изображение.

жонглер
источник
Окей круто. Спасибо за ответ. Вы упоминаете «текстовый режим». Есть ли другие режимы для стандартного терминала? Или это единственный другой способ интерпретации, как вы сказали, через приложение, которое может правильно отобразить этот тип файла?
Qcom
4
@ БОСС, нет, я думаю, что Гордоко хотел сказать, что терминал - это текстовое устройство. Первоначальная цель catсостоит в том, чтобы собрать файлы вместе, как в cat filea fileb > filec, если вы не проходите через терминал (как в этом примере), тогда не имеет значения, является ли файл текстовым или двоичным. В мире Unix двоичные и текстовые файлы хранятся одинаково, только текстовые файлы содержат несколько ограниченный набор байтов. Обычное использование cat - это перенаправление содержимого файла командам, которые не принимают имена файлов в качестве параметров, но принимают ввод от стандартного ввода.
Asoundmove
@BOSS, говоря, что файл - это текстовый файл, а не двоичный, означает только, что двоичный контент файла можно интерпретировать как текст. Раньше все было просто: файл был ASCII или нет. В настоящее время файл может иметь несколько различных текстовых форматов, включая ASCII, UTF8, UTF16 ... На жестком диске они все двоичные.
asoundmove
@asoundmove: Вы правы, я должен был сказать текстовое устройство, а не двусмысленный термин «текстовый режим». Я отредактировал свой ответ.
жонглер
Я только что использовал cat на растровом изображении, и оно выводило на терминал не только символы ascii, но и символы юникода (например, «ڣ» и «漥»). Есть идеи, почему это так?
Магнус