Получить длину для декодирования Ascii85

ascii85 имеет функцию получения максимальной длины кодировки MaxEncodedLen().

Я думаю, что у него тоже должна быть функция для получения длины при декодировании, как в Base64.

http://golang.org/pkg/encoding/ascii85/


person user316368    schedule 29.04.2010    source источник


Ответы (2)


Вот функция для вычисления Go package ascii85 MaxDecodedLen() для n закодированных байтов.

func MaxDecodedLen(n int) int {
    const binWordLen = 4
    return n * binWordLen
}

Если все четыре байта незакодированной группы равны нулю, они представлены одним байтом, символом z, а не пятью восклицательными знаками (!!!!!). В некоторых реализациях незакодированная группа пробелов может быть представлена ​​одним символом y.

ascii85.Decode(), в отличие от ascii85.Encode(), имеет параметры количества потребляемых байтов (nsrc) и flush в дополнение к параметру количества записываемых байтов (ndst), который позволяет программисту декодировать несколько блоков или один блок по частям. Следовательно, может использоваться буфер назначения меньше, чем MaxDecodedLen().

person peterSO    schedule 29.04.2010

На мой взгляд, при кодировании MaxEncodedLen() обязательно знать количество байтов, необходимых для хранения закодированного вывода (т.е. размер буфера назначения).
Где в случае декодирования вызывающий может передать буфер назначения равного размера в исходный буфер, хотя буфер назначения может быть меньшего размера.
В качестве альтернативы мы можем использовать исходный источник, т.е. обычный некодированный размер буфера, если контекст/область выполнения кодирования и декодирования совпадают. Следовательно, ожидаемая функция MaxDecodedLen() является необязательной.

person user328731    schedule 29.04.2010
comment
@thiya: при расчете максимального размера буфера следует учитывать сжатие. - person peterSO; 30.04.2010