Почему бинарные файлы, такие как этот фрагмент PNG, содержат все эти пробелы

327
Lance Pollard

Вот фрагмент первой части PNG-файла, который можно просмотреть, просто открыв его в Sublime Text и непосредственно просмотрев шестнадцатеричный код.

8950 4e47 0d0a 1a0a 0000 000d 4948 4452 0000 02e7 0000 0155 0806 0000 004c ed41 2b00 0000 0662 4b47 4400 ff00 ff00 ffa0 bda7 9300 0000 0774 494d 4507 d907 1209 3738 0601 8766 0000 2000 4944 4154 789c ecbd 799c 6567 5de7 fff9 3ef7 5675 279d a4b3 d008 1242 2288 c486 10e8 ee74 57a7 bb53 28a2 202e a8c1 0d07 d780 a8a3 8338 fc04 c601 45dc 1750 5161 1670 e437 0e71 5c90 4504 a549 77ba 7a65 0f20 8681 8140 423a 2b49 7aa9 aafb 7ce7 8fb3 dce7 3ce7 

Похоже, вы могли бы сэкономить место, удалив пробелы в файле. Мне было бы интересно узнать, будет ли это техника оптимизации для PNG. Или, возможно, есть какое-то преимущество или цель в том, чтобы эти 4-символьные последовательности были разделены 1 пробелом, о котором я не знаю.

0
Что вы имеете в виду, пробел? Эти столбцы между, например, 8950 и 4e47 на самом деле отсутствуют в файле. John Dvorak 5 лет назад 3
Я так растерялся. В Sublime Text я могу выделить пробел в столбцах, поэтому я не понимаю. Lance Pollard 5 лет назад 0
Это действительно файл PNG (вы можете открыть его в программе просмотра изображений), а не вывод, скажем, XXD? XXD может группировать байты по двум, но я не знаю, можно ли сделать так, чтобы в нем отсутствовал столбец открытого текста. John Dvorak 5 лет назад 0
Да, это просто обычный PNG. Я получаю те же результаты при просмотре скриншота, сделанного на Mac. Lance Pollard 5 лет назад 0

1 ответ на вопрос

2
grawity

Пробел не в файле. То, что вы видите, - это не текст - это список шестнадцатеричных чисел, и число одинаково, имеет ли он пробел в середине или нет. Таким образом, все равно остается четыре байта, независимо от того, записываете ли вы их как 89 50 4e 47или 89504e47или как (137, 80, 78, 71)или действительно как �PNG.

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

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

Спасибо, я наконец начинаю понимать. Я не понимаю, почему так сложно просто открыть двоичный файл и посмотреть 001010011 кучу 1 и 0, это было бы неплохо. Lance Pollard 5 лет назад 0
@LancePollard: Это сложно, потому что вы пытаетесь сделать это с помощью текстового редактора, который не построен с учетом этого. (Даже имея шестнадцатеричный режим _at all_, Sublime уже превосходит большинство текстовых редакторов.) grawity 5 лет назад 0
@LancePollard: Но это также бесполезная вещь, которую нужно просить - даже если бы она была двоичной, вы бы увидели те же самые числа, просто в формате, который намного более многословен, с ним гораздо сложнее работать. Опять же, не имеет значения, видите ли вы числа в шестнадцатеричном, двоичном, десятичном, восьмеричном, ** это одинаковые числа. ** Шестнадцатеричные редакторы используют шестнадцатеричные, потому что с ними проще всего работать. Большинство людей, которым нужна эта функция, если они увидят двоичный файл, скажут: «Я не понимаю, почему так сложно просто открыть файл с шестнадцатеричным 89504e ..., это было бы неплохо». grawity 5 лет назад 2
Полезно знать, большое спасибо :) Lance Pollard 5 лет назад 0