Формат данных, применяемый в uuencode. 1) Набор символов. Для кодирования информации применяется набор символов из таблицы ASCII начиная с символа "!" (восклицательный знак) и кончая символом "`" (знак слабого ударения). Каждый ASCII символ представляет 6 информационных бит. Преобразование из 6 бит в ASCII ведётся следующим образом: a) берутся исходные 6 бит, b) в случае нуля прибавляется 0x40, c) прибавляется 0x20. Пункт b) применяется для того, чтобы в поток данных не попали пробелы. Таким образом, символ "`" находится в начале, а не в конце таблицы. 2) Информационные строки. Строка содержит следующие элементы: информацию о длине строки и собственно данные. Первый символ - это длина исходных данных для строки. Все строки, кроме последней, содержат 45 байт - этой длине соответствует символ "M". Поскольку на каждый символ приходится 6 бит, 45 байтам соответствует 60 символов. В результате, одна (не последняя) строка занимает 62 байта ("M", информация, LF). В последней строке может быть не кратное шести количество информационных бит. В таком случае "недостающие" биты забиваются нулями. При подсчёте контрольной суммы строки суммируются все исходные байты потока. Младшие шесть бит суммы выводятся в виде символа в конце строки. 3) Общий формат a) section <номер> of <количество> of file <имя> Содержит номер секции, общее количество секций и имя файла. Параметры filetime, table и begin присутствуют только в первой секции. b) filetime <время> Содержит дату и время создания файла во внутреннем формате IBM PC. Представляет собой 32-битное целое десятичное число. Формат следующий: дата время 0000000 0000 00000 00000 000000 00000 (32bit) год месяц день часы минуты секунды При этом год отсчитывается от 1980, а секунды только чётные (0,2,4...) c) begin <доступ> <имя> Признак начала данных. Формат флагов доступа соответствует применяемому в системе UNIX - восьмеричное число, биты которого - rwxrwxrwx, где: r - разрешён доступ по чтению, w - разрешён доступ по записи, x - разрешено выполнение, и каждая цифра означает соответственно доступ для пользователя, группы пользователей и всего остального мира. Подробнее читайте доки по UNIX. d) информация Представлена в виде информационных строк. За последней информационной строкой следует пустая строка с "`" в начале, не содержащая данных. Если используется контрольная сумма строки, ставится два символа "`" (что соответствует нулевой сумме). e) end Признак конца данных. Следует за пустой строкой, находится в последней секции. f) size <длина> Длина файла. Присутствует обычно в случае отсутствия контрольных сумм. g) sum -r/size <сумма>/<длина> section Контрольная сумма секции. Длина секции считается по длине конечного файла, начиная от первой строки данных (или begin при его наличии) до последней строки данных (или end при его наличии). При подсчёте предполагается, что конец строки - LF (0x0A). Контрольная сумма - беззнаковое 16-битное десятичное число. Подсчёт ведётся следующим образом: начальное значение - нуль, затем для каждого очередного байта из потока делается циклический сдвиг контрольной суммы вправо на один разряд (в отличие от операции >> в Си, младший разряд не исчезает, а попадает в старший разряд) и прибавляется очередной байт. h) sum -r/size <сумма>/<длина> entire input file Контрольная сумма всего файла. Считается по тому же алгоритму, байты берутся из самого файла. Приводится длина исходного файла.