Jump to content

uuкодирование

(Перенаправлено с Uuencode )

uuencoding — это форма кодирования двоичного кода в текст , которая возникла в Unix программах uuencode и uudecode, написанных Мэри Энн Хортон в Калифорнийском университете в Беркли в 1980 году. [1] для кодирования двоичных данных для передачи в системах электронной почты .

Название «uuencoding» происходит от Unix-to-Unix Copy , т.е. «Unix-to-Unix-кодирование» — это безопасное кодирование для передачи произвольных файлов из одной системы Unix в другую систему Unix, но без гарантии, что промежуточные ссылки будут все это системы Unix. Поскольку сообщение электронной почты может пересылаться через или на компьютеры с другими наборами символов или через транспорты, которые не являются 8-битными , или обрабатываться программами, которые не являются 8-битными, пересылка двоичного файла по электронной почте может привести к его повреждению. . За счет кодирования таких данных в подмножество символов, общее для большинства наборов символов, закодированная форма таких файлов данных вряд ли будет «переведена» или повреждена и, таким образом, будет доставлена ​​в пункт назначения в целости и сохранности. Программа uudecode отменяет эффект uuencode , точно воссоздавая исходный двоичный файл. uuencode/decode стал популярен для отправки двоичных (и особенно сжатых) файлов по электронной почте, публикации в Usenet группах новостей и т. д.

Сейчас он в значительной степени заменен MIME и yEnc . При использовании MIME файлы, которые могли быть закодированы uu, вместо этого передаются в кодировке Base64 .

Закодированный формат

[ редактировать ]

Файл в кодировке uu начинается со строки заголовка вида:

начать <режим> <файл><новая строка> 

<mode> к файлу в — это права доступа формате Unix , представленные тремя восьмеричными цифрами (например, 644, 744). Обычно это важно только для Unix-подобных операционных систем.

<file> — имя файла, которое будет использоваться при воссоздании двоичных данных.

<newline> означает символ новой строки , используемый для завершения каждой строки.

Каждая строка данных использует формат:

<длина символа><форматированные символы><новая строка> 

<length character> — это символ, указывающий количество байтов данных, закодированных в этой строке. Это символ ASCII , определяемый добавлением 32 к фактическому количеству байтов, за единственным исключением серьезного акцента «`» (код ASCII 96), обозначающего ноль байтов. Все строки данных, кроме последней (если длина данных не делится на 45), имеют 45 байт закодированных данных (60 символов после кодирования). Следовательно, подавляющее большинство значений длины — это «M» (32 + 45 = код ASCII 77 или «M»).

<formatted characters> являются закодированными символами. См. § Механизм форматирования для получения более подробной информации о фактической реализации.

Файл заканчивается двумя строками:

`<новая строка>конец <новая строка> 

Предпоследняя строка также является символом, обозначающим длину строки, с акцентом, обозначающим нулевые байты.

В качестве полного файла вывод в кодировке uu для обычного текстового файла с именем cat.txt, содержащего только символы Cat , будет иметь вид

начало 644 cat.txt#0В%Т`конец 

Начальная строка представляет собой стандартный заголовок uuencode; '#' указывает, что его строка кодирует три символа; последние две строки появляются в конце всех файлов, закодированных uu.

Механизм форматирования

[ редактировать ]

Механизм uuencoding повторяет следующее для каждых 3 байтов, кодируя их в 4 печатных символа, каждый символ представляет по основанию 64 числовую цифру :

  1. Начните с 3 байтов исходного кода, 24 бита . всего
  2. Разделено на 4 6-битные группы, каждая из которых представляет значение в диапазоне от 0 до 63: биты (00–05), (06–11), (12–17) и (18–23).
  3. Добавьте 32 к каждому из значений. При добавлении 32 это означает, что возможные результаты могут находиться в диапазоне от 32 ("" пробел) до 95 ("_" подчеркивание ). 96 («`» серьезное ударение ) как «специальный символ» является логическим расширением этого диапазона. Несмотря на то, что символ пробела задокументирован как кодировка значения 0, реализации, такие как GNU sharutils, [2] на самом деле используйте символ серьезного акцента для кодирования нулей в теле файла, никогда не используя пробел.
  4. Выведите ASCII-эквивалент этих чисел.

Если исходная длина не делится на 3, то последний 4-байтовый раздел будет содержать байты заполнения, чтобы сделать его делимым без ошибок. Эти байты вычитаются из строки <length character> чтобы декодер не добавлял в файл нежелательные символы.

uudecoding это обратное вышеописанному: вычтите 32 из ASCII-кода каждого символа ( по модулю 64 для учета использования серьезного акцента), чтобы получить 6-битное значение, объедините 4 6-битные группы, чтобы получить 24 бита, затем выведите 3 байта.

Процесс кодирования демонстрируется в этой таблице, в которой показано получение вышеуказанной кодировки для «Кошка».

Оригинальные персонажи Cat
Исходный ASCII, десятичный 67 97 116
ASCII, двоичный 0 1 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 1 1 1 0 1 0 0
Новые десятичные значения 16 54 5 52
+32 48 86 37 84
Uu-кодированные символы 0V%T

таблица uuencode

[ редактировать ]

В следующей таблице показано преобразование десятичных значений 6-битных полей, полученных в процессе преобразования, и соответствующий им выходной код и символ ASCII-символа.

Обратите внимание, что некоторые кодеры могут выдавать пробел (код 32) вместо серьезного акцента («`», код 96), тогда как некоторые декодеры могут отказываться декодировать данные, содержащие пробел.

биты ASCII
код
ASCII
голец
биты ASCII
код
ASCII
голец
биты ASCII
код
ASCII
голец
биты ASCII
код
ASCII
голец
00 96 `16 48 032 64 @48 80 P
01 33 !17 49 133 65 A49 81 Q
02 34 "18 50 234 66 B50 82 R
03 35 #19 51 335 67 C51 83 S
04 36 $20 52 436 68 D52 84 T
05 37 %21 53 537 69 E53 85 U
06 38 &22 54 638 70 F54 86 V
07 39 '23 55 739 71 G55 87 W
08 40 (24 56 840 72 H56 88 X
09 41 )25 57 941 73 I57 89 Y
10 42 *26 58 :42 74 J58 90 Z
11 43 +27 59 ;43 75 K59 91 [
12 44 ,28 60 <44 76 L60 92 \
13 45 -29 61 =45 77 M61 93 ]
14 46 .30 62 >46 78 N62 94 ^
15 47 /31 63 ?47 79 O63 95 _

Ниже приведен пример кодирования uu однострочного текстового файла. В этом примере %0D — это байтовое представление возврата каретки , а %0A — байтовое представление перевода строки .

файл
Имя файла = wikipedia-url.txtСодержимое файла = http://www.wikipedia.org%0D%0A 
uuкодирование
начало 644 wikipedia-url.txt::'1T<#HO+W=W=RYW:6MI<&5D:6$N;W)G#0H``конец 

Форки (файл, ресурс)

[ редактировать ]

В Unix традиционно имеется единственная вилка , в которой хранятся данные файлов. Однако некоторые файловые системы поддерживают несколько ветвей, связанных с одним файлом. Например, классическая иерархическая файловая система Mac OS (HFS) поддерживала ветвь данных и ветвь ресурсов . Mac OS HFS+ поддерживает несколько разветвлений, как и Microsoft Windows NTFS альтернативные потоки данных . Большинство инструментов uucoding обрабатывают данные только из основной ветки данных, что может привести к потере информации при кодировании/декодировании (например, комментарии к файлам Windows NTFS хранятся в другой ветке). Некоторые инструменты (например, классическое приложение для Mac OS UUTool ) решили проблему, объединив разные ветки в один файл и дифференцировав их по имени файла.

Связь с xxencode, Base64 и Ascii85

[ редактировать ]

Несмотря на ограниченный диапазон символов, данные в кодировке uu иногда повреждаются при прохождении через определенные компьютеры, использующие наборы символов, отличные от ASCII, такие как EBCDIC . Одной из попыток решить проблему стал формат xxencode, в котором использовались только буквенно-цифровые символы, а также символы плюс и минус. Сегодня более распространенным является формат Base64, который основан на той же концепции только буквенно-цифровых символов , в отличие от ASCII 32–95. Все три формата используют 6 бит (64 различных символа) для представления входных данных.

Base64 также может быть сгенерирован программой uuencode и аналогичен по формату, за исключением фактического перевода символов:

Заголовок изменен на

Begin-base64 <режим> <файл> 

трейлер становится

==== 

а строки между ними кодируются символами, выбранными из

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 

Другой альтернативой является Ascii85 , который кодирует четыре двоичных символа пятью символами ASCII. Ascii85 используется в форматах PostScript и PDF .

Недостатки

[ редактировать ]

uuencoding принимает 3 предварительно отформатированных байта и превращает их в 4, а также добавляет начальные/конечные теги, имя файла и разделители . Это добавляет как минимум 33% дополнительных затрат на данные по сравнению с одним только исходным кодом, хотя это можно, по крайней мере, в некоторой степени компенсировать, сжимая файл перед его кодированием.

Поддержка на языках

[ редактировать ]

Язык Python поддерживает кодирование uu с помощью модуля codecs с кодеком «uu»:

Для Python 2 (устарело/прекращено с 1 января 2020 г.) :

$  python   -c   'print "Cat".encode("uu")'  start 666 <data>  #  0V%T конец  $ 

Для Python 3 , где модуль кодеков необходимо импортировать и использовать напрямую :

$  python3   -c   "из импорта кодеков encode;print(encode(b'Cat', 'uu'))"  b'begin 666 <data>\n#0V%T\n \nend\n'  $ 

Для декодирования передайте весь файл:

$  python3   -c   "из импорта кодеков decode;print(decode(b'begin 666 <data>\n#0V%T\n \nend\n', 'uu'))"  b'Cat' 

Язык Perl изначально поддерживает кодирование uu с использованием операторов package() и unpack() со строкой формата «u»:

$  perl   -e   'print package("u","Cat")'  #  0V%T 

Декодирование base64 с помощью unpack также можно выполнить путем перевода символов:

$  perl   -e   'print unpack("u","#0V%T")'  Cat 

Чтобы создавать правильно сформированные файлы в кодировке uu, вам необходимо использовать модули, [3] или еще немного кода: [4]

Кодировать (однострочное)

[ редактировать ]
$  perl   -ple    'BEGIN{use File::Basename;$/=undef;$sn=basename($ARGV[0]);} $_= "begin 600 $sn\n".(pack "u", $ _)."`\nend" if $_'   /some/file/to_encode.gz 

Кодирование/декодирование (правильные сценарии Perl)

[ редактировать ]

https://metacpan.org/dist/PerlPowerTools/view/bin/uuencode

https://metacpan.org/dist/PerlPowerTools/view/bin/uudecode

См. также

[ редактировать ]
  1. ^ Хортон, Марк. «UUENCODE(1C) Руководство программиста UNIX» . Общество наследия Unix . Проверено 10 ноября 2020 г.
  2. ^ «Источник uuencode.c» . fossies.org . Проверено 5 июня 2021 г.
  3. ^ «Исходный код PerlPowerTools» . Metacpan.org . Проверено 12 февраля 2024 г.
  4. ^ «Исходный код uuencode.pl» . main.linuxfocus.org . Проверено 12 февраля 2024 г.
[ редактировать ]
  • uuencode запись в POSIX.1-2008
  • GNU-sharutils — набор утилит shar/unshar/uuencode/uudecode с открытым исходным кодом.
  • UUDeview - программа с открытым исходным кодом для кодирования/декодирования Base64, BinHex, uuencode, xxencode и т. д. для Unix/Windows/DOS.
  • UUENCODE-UUDECODE - программа с открытым исходным кодом для кодирования/декодирования, созданная Клемом «Дедушкой» Даем.
  • StUU - быстрый UUDecoder с открытым исходным кодом для Macintosh от Стюарта Чешира
  • UUENCODE-UUDECODE – бесплатные онлайн-UUEncoder и UUDecoder
  • Java UUDecoder - библиотека Java с открытым исходным кодом для декодирования вложений в кодировке uuencoded (почты).
  • AN11229 – Примечание по применению NXP: UUencoding для UART ISP


Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: a1bc041adfdb2226d6abc79adffe5348__1715539620
URL1:https://arc.ask3.ru/arc/aa/a1/48/a1bc041adfdb2226d6abc79adffe5348.html
Заголовок, (Title) документа по адресу, URL1:
uuencoding - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)