Как кодировать/декодировать файл JPG в целочисленную последовательность?

Добавьте _JAVA_OPTIONS='-Dawt.useSystemAAFontSettings=on'в ваш файл /etc/environment.

Если вы запускаете Java-приложения из консоли, добавьте export _JAVA_OPTIONS='-Dawt.useSystemAAFontSettings=on'к вашему .bashrc(, если вы используете оболочку bash ), или .zshrc(, если вы запускаете Z-оболочку ).

Выйдите из системы и войдите снова.

0
13.04.2019, 17:58
3 ответа

POSIXly:

od -An -vtu1 < file > file.encoded

Где каждый и vкаждый байт файла кодируется как uдесятичное число без знака с nили Aадресом.

Для декодирования с некоторыми awkреализациями (такими, как gawkили mawk, где printf("%c", 0)работает):

awk '{for (i = 1; i <= NF; i++) printf "%c", $i}' < file.encoded > file

Несколько замечаний о том, почему ваш подход не работает:

  • оболочки, отличные от zsh, не могут хранить произвольные данные (, особенно байт NUL )в своей переменной.
  • и подстановка команд в Bourne -, как оболочки, разделяет символы новой строки в конце (0xa байт на большинстве систем)
  • вам нужно заключать в кавычки переменные в Bourne -, как оболочки, отличные отzsh
  • В оболочках с оператором${var:offset:length}ksh93(ksh93, bash, zsh, mksh), offsetи lengthвыражаются в количестве символов, а не в байтах (UTF -8 однако является единственной многобайтовой -кодировкой символов, поддерживаемой mkshи только при включенной опции utf8-mode).
  • printf %d \'xвозвращает номер кода символа.Это только значение байта в однобайтовых наборах символов -. Здесь вы, вероятно, используете bashи находитесь в локали, использующей кодировку UTF -8, посколькуbashprintfдает случайные значения для байтов, не являющихся частью допустимых символов там .
  • текст определяется как последовательность текстовых строк, которые сами по себе являются последовательностями не -NUL символов (, поэтому ограничены последовательностями байтов, образующими допустимые символы ), длина которых (в количестве байты , включая символ новой строки ), не превышают LINE_MAX(, см.getconf LINE_MAX)и разделяются символом новой строки. Таким образом, за исключением очень маленьких файлов jpg, ваш sai.outв конечном итоге не будет действительным текстом, и у вас не будет никакой гарантии, что он будет нормально обработан текстовыми утилитами.(odздесь выводит только несколько чисел в строке ).
4
28.01.2020, 02:14

Если hex является допустимым целочисленным представлением, xxd сделает всю работу за вас:

xxd -p image.jpg > image.hex

И, чтобы вернуться к изображению:

xxd -p -r image.hex > image-copy.jpg
3
28.01.2020, 02:14

Мой ответ основан на подсказке Стрелы. Я не эксперт в sed, поэтому я верю в лучшее решение, чем это, но пока оно работает.

Стратегия заключалась в том, чтобы преобразовать мой файл в шестнадцатеричный с помощью xxd, а затем преобразовать шестнадцатеричный в целочисленный.

Кодировать:

xxd -p $1 | sed 's/.\{2\}/& /g' | sed 's/[^ ]* */0x&/g' | awk '{ for(i=1;i<=NF;i++) printf("%i ",$i); print ""; }' > $2

Декодировать:

awk '{ for(i=1;i<=NF;i++) printf("%02x ",$i); print ""; }' $IN > $OUT
xxd -p -r $OUT $OUT_IMAGE_NAME.jpg
rm $OUT
0
28.01.2020, 02:14

Теги

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