класс Zlib::Inflate
Zlib::Inflate — это класс для распаковки сжатых данных. В отличие от Zlib::Deflate, экземпляр этого класса не может быть продублирован (клонирован, дублирован).
Публичные методы класса
Исходный код
static VALUE
rb_inflate_s_inflate(VALUE obj, VALUE src)
{
struct zstream z;
VALUE dst, args[2];
int err;
StringValue(src);
zstream_init_inflate(&z);
err = inflateInit(&z.stream);
if (err != Z_OK) {
raise_zlib_error(err, z.stream.msg);
}
ZSTREAM_READY(&z);
args[0] = (VALUE)&z;
args[1] = src;
dst = rb_ensure(inflate_run, (VALUE)args, zstream_ensure_end, (VALUE)&z);
return dst;
} Распаковывает string. Выбрасывает исключение Zlib::NeedDict, если для распаковки требуется предопределённый словарь.
Этот метод почти эквивалентен следующему коду:
def inflate(string) zstream = Zlib::Inflate.new buf = zstream.inflate(string) zstream.finish zstream.close buf end
См. также Zlib.deflate
Исходный код
static VALUE
rb_inflate_initialize(int argc, VALUE *argv, VALUE obj)
{
struct zstream *z;
VALUE wbits;
int err;
rb_scan_args(argc, argv, "01", &wbits);
TypedData_Get_Struct(obj, struct zstream, &zstream_data_type, z);
err = inflateInit2(&z->stream, ARG_WBITS(wbits));
if (err != Z_OK) {
raise_zlib_error(err, z->stream.msg);
}
ZSTREAM_READY(z);
return obj;
} Создаёт новый поток распаковки для распаковки. window_bits устанавливает размер буфера истории и может принимать следующие значения:
- 0
-
Использовать размер окна из заголовка zlib сжатого потока.
- (8..15)
-
Переопределяет размер окна заголовка распаковки в сжатом потоке. Размер окна должен быть больше или равен размеру окна сжатого потока.
- Больше 15
-
Добавить 32 к window_bits для активации декодирования zlib и gzip с автоматическим обнаружением заголовка или добавить 16 для декодирования только формата gzip (для не-gzip потока будет выброшено исключение
Zlib::DataError). - (-8..-15)
-
Включает режим raw deflate, который не будет генерировать значение проверки и не будет искать какие-либо значения проверки для сравнения в конце потока.
Это используется с другими форматами, которые используют сжатый формат deflate, например, zip, которые предоставляют свои собственные значения проверки.
Пример
open "compressed.file" do |compressed_io|
zi = Zlib::Inflate.new(Zlib::MAX_WBITS + 32)
begin
open "uncompressed.file", "w+" do |uncompressed_io|
uncompressed_io << zi.inflate(compressed_io.read)
end
ensure
zi.close
end
end
Публичные методы экземпляра
Исходный код
static VALUE
rb_inflate_addstr(VALUE obj, VALUE src)
{
struct zstream *z = get_zstream(obj);
if (ZSTREAM_IS_FINISHED(z)) {
if (!NIL_P(src)) {
StringValue(src);
zstream_append_buffer2(z, src);
}
}
else {
do_inflate(z, src);
if (ZSTREAM_IS_FINISHED(z)) {
zstream_passthrough_input(z);
}
}
return obj;
} То же самое, что и IO.
Исходный код
static VALUE
rb_inflate_add_dictionary(VALUE obj, VALUE dictionary)
{
VALUE dictionaries = rb_ivar_get(obj, id_dictionaries);
VALUE checksum = do_checksum(1, &dictionary, adler32);
rb_hash_aset(dictionaries, checksum, dictionary);
return obj;
} Предоставляет потоку распаковки словарь, который может потребоваться в будущем. Можно предоставить несколько словарей. Поток распаковки автоматически выберет правильный предоставленный пользователем словарь в зависимости от требуемого словаря потока.
Исходный код
static VALUE
rb_inflate_inflate(int argc, VALUE* argv, VALUE obj)
{
struct zstream *z = get_zstream(obj);
struct rb_zlib_inflate_arguments arguments = {z, argc, argv};
return rb_mutex_synchronize(z->mutex, rb_inflate_inflate_body, (VALUE)&arguments);
} Вводит deflate_string в поток распаковки и возвращает результат из потока. Вызов этого метода сбрасывает как буфер ввода, так и буфер вывода потока. Если строка nil, этот метод завершает поток, так же как и Zlib::ZStream#finish.
Если передан блок, последовательные распакованные куски из deflate_string передаются в блок, а nil возвращается.
Если в качестве ключевого аргумента :buffer передано значение, отличное от nil:
-
Ключевой аргумент :buffer должен быть
Stringи будет использоваться в качестве буфера вывода. Использование этого параметра позволяет повторно использовать память, необходимую для распаковки. -
Если блок не передан, возвращаемое значение будет тем же объектом, что и ключевой аргумент :buffer.
-
Если передан блок, переданные куски будут иметь то же значение, что и ключевой аргумент :buffer.
Выбрасывает исключение Zlib::NeedDict, если для распаковки требуется предопределённый словарь. Set словарь с помощью Zlib::Inflate#set_dictionary и затем вызовите этот метод ещё раз со пустой строкой, чтобы сбросить поток:
inflater = Zlib::Inflate.new begin out = inflater.inflate compressed rescue Zlib::NeedDict # ensure the dictionary matches the stream's required dictionary raise unless inflater.adler == Zlib.adler32(dictionary) inflater.set_dictionary dictionary inflater.inflate '' end # ... inflater.close
См. также Zlib::Inflate.new
Исходный код
static VALUE
rb_inflate_set_dictionary(VALUE obj, VALUE dic)
{
struct zstream *z = get_zstream(obj);
VALUE src = dic;
int err;
StringValue(src);
err = inflateSetDictionary(&z->stream,
(Bytef*)RSTRING_PTR(src), RSTRING_LENINT(src));
if (err != Z_OK) {
raise_zlib_error(err, z->stream.msg);
}
return dic;
} Устанавливает предопределённый словарь и возвращает string. Этот метод доступен только после того, как было выброшено исключение Zlib::NeedDict. Подробнее см. zlib.h.
Исходный код
static VALUE
rb_inflate_sync(VALUE obj, VALUE src)
{
struct zstream *z = get_zstream(obj);
StringValue(src);
return zstream_sync(z, (Bytef*)RSTRING_PTR(src), RSTRING_LEN(src));
} Вводит string в конец буфера ввода и пропускает данные до тех пор, пока не будет найден полный момент сброса. Если точка найдена в буфере, этот метод сбрасывает буфер и возвращает false. В противном случае возвращает true, и следующие данные полного момента сброса сохраняются в буфере.
Исходный код
static VALUE
rb_inflate_sync_point_p(VALUE obj)
{
struct zstream *z = get_zstream(obj);
int err;
err = inflateSyncPoint(&z->stream);
if (err == 1) {
return Qtrue;
}
if (err != Z_OK) {
raise_zlib_error(err, z->stream.msg);
}
return Qfalse;
} Прямая цитата из исходной документации:
What is this?
:)
Ruby Core © 1993–2024 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.