Как увеличить размер файла в байтах, не затрагивая содержимое?

Как увеличить размер файла в байтах, не затрагивая содержимое?

Есть ли способ легко и произвольно увеличить размер файла в байтах, не повреждая его содержимое? Например, вставив фиктивные байты. Файл для моего варианта использования имеет тип png.

Я использую OS X, но любые решения приветствуются.

решение1

Буквальный ответ на ваш вопрос — нет, по определению. Размер файла — это длина его содержимого. Если вы хотите изменить размер, вам нужно будет изменить содержимое.

Однако, возможно, удастся изменить содержание и получитьэквивалентное содержаниекоторый имеет другой размер. Возможность этого зависит от формата файла и того, что вы считаете эквивалентом.

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

convert old.png -comment 'This comment will be added to the image file, making it larger' new.png

Максимальный размер переносимого комментария составляет2ГБ(Вы можете увеличить размер до 4 ГБ). В принципе, вы можете разместить несколько комментариев (или использовать другие имена полей), но я не знаю, поддерживают ли это обычные программы.

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

cp old.png new.png
echo 'trailing garbage' >>new.png

Ты можешьиспользуйте truncateкомандулегко добавлять нулевые байты для достижения определенного размера. Просто помните, что полученный файл широко принят, но технически он недействителен, поэтому может быть принят не везде. (Кажется, это работает в каждой программе, которая используетlibpng(или производная, и эта библиотека широко распространена, поэтому у вас есть все шансы, что файл будет работать.)

решение2

Команда truncateимеет малоизвестную опцию для увеличения размера файлов путем добавления нулевых байтов, которые не будут видны в содержимом, если только вы не используете редактор, который явно показывает их, например vim.

Объясняется правильный синтаксис.на странице руководства, но, как правило, передайте -sопцию и укажите либо желаемый размер файла -s 10k, либо добавьте «+», например, -s +10kчтобы добавить указанное количество нулевых байтов в файл.

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

решение3

В зависимости от ваших целей вы можете создатьразреженный файл. Например...

dd of=sparse bs=5M seek=1 count=0

Это создает файл, который кажется размером 5 мегабайт, но занимает 0 места на диске. При чтении "лишнее пространство" будет выглядеть как нули.

Вы можете сделать существующий файл разреженным с помощью truncate -s. Например, я сделал этот анимированный GIF размером 5 мегабайт, но занимающим на диске всего 102 килобайта.

$ ls -l pikachu-nyan.gif 
-rw-r--r-- 1 schwern staff 100872 Oct 29  2019 pikachu-nyan.gif

$ truncate -s 5M pikachu-nyan.gif 

$ ls -l pikachu-nyan.gif 
-rw-r--r-- 1 schwern staff 5242880 Jan  9 14:32 pikachu-nyan.gif

Информация о файле, найденная Finder, гласит...5,242,880 bytes (102 KB on disk)

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

Связанный контент