Zum Inhalt springen

Komprimierung

Komprimieren und dekomprimieren Sie Daten mit gzip, deflate, zlib, brotli und zstd-Algorithmen.

local compress = require("compress")

Am weitesten verbreitetes Format (RFC 1952).

-- Für HTTP-Response komprimieren
local body = json.encode(large_response)
local compressed, err = compress.gzip.encode(body)
if err then
return nil, err
end
-- Content-Encoding-Header setzen
res:set_header("Content-Encoding", "gzip")
res:write(compressed)
-- Maximale Komprimierung für Speicherung
local archived = compress.gzip.encode(data, {level = 9})
-- Schnelle Komprimierung für Echtzeit
local fast = compress.gzip.encode(data, {level = 1})
ParameterTypBeschreibung
datastringZu komprimierende Daten
optionstable?Optionale Kodierungsoptionen
FeldTypBeschreibung
levelintegerKomprimierungsstufe 1-9 (Standard: 6)

Gibt zurück: string, error

-- HTTP-Request dekomprimieren
local content_encoding = req:header("Content-Encoding")
if content_encoding == "gzip" then
local body = req:body()
local decompressed, err = compress.gzip.decode(body)
if err then
return nil, errors.new("INVALID", "Invalid gzip data")
end
body = decompressed
end
-- Dekomprimieren mit Größenbegrenzung (Zip-Bomben verhindern)
local decompressed, err = compress.gzip.decode(data, {max_size = 10 * 1024 * 1024})
if err then
return nil, errors.new("INVALID", "Decompressed size exceeds 10MB limit")
end
ParameterTypBeschreibung
datastringGZIP-komprimierte Daten
optionstable?Optionale Dekodierungsoptionen
FeldTypBeschreibung
max_sizeintegerMax. dekomprimierte Größe in Bytes (Standard: 128MB, Max: 1GB)

Gibt zurück: string, error

Beste Komprimierungsrate für Text (RFC 7932).

-- Am besten für statische Assets und Textinhalte
local compressed = compress.brotli.encode(html_content, {level = 11})
-- Komprimierte Assets cachen
cache:set("static:" .. hash, compressed)
-- Moderate Komprimierung für API-Responses
local compressed = compress.brotli.encode(json_data, {level = 4})
ParameterTypBeschreibung
datastringZu komprimierende Daten
optionstable?Optionale Kodierungsoptionen
FeldTypBeschreibung
levelintegerKomprimierungsstufe 0-11 (Standard: 6)

Gibt zurück: string, error

local decompressed, err = compress.brotli.decode(compressed_data)
if err then
return nil, err
end
-- Mit Größenbegrenzung
local decompressed = compress.brotli.decode(data, {max_size = 50 * 1024 * 1024})
ParameterTypBeschreibung
datastringBrotli-komprimierte Daten
optionstable?Optionale Dekodierungsoptionen
FeldTypBeschreibung
max_sizeintegerMax. dekomprimierte Größe in Bytes (Standard: 128MB, Max: 1GB)

Gibt zurück: string, error

Schnelle Komprimierung mit guten Raten (RFC 8878).

-- Gute Balance zwischen Geschwindigkeit und Rate
local compressed = compress.zstd.encode(binary_data)
-- Höhere Komprimierung für Archivierung
local archived = compress.zstd.encode(data, {level = 19})
-- Schnellmodus für Echtzeit-Streaming
local fast = compress.zstd.encode(data, {level = 1})
ParameterTypBeschreibung
datastringZu komprimierende Daten
optionstable?Optionale Kodierungsoptionen
FeldTypBeschreibung
levelintegerKomprimierungsstufe 1-22 (Standard: 3)
dictstring?Zstd-Dictionary-Bytes aus train_dict (Standard: keine)

Gibt zurück: string, error

local decompressed, err = compress.zstd.decode(compressed_data)
if err then
return nil, err
end
ParameterTypBeschreibung
datastringZstandard-komprimierte Daten
optionstable?Optionale Dekodierungsoptionen
FeldTypBeschreibung
max_sizeintegerMax. dekomprimierte Größe in Bytes (Standard: 128MB, Max: 1GB)
dictstring?Zstd-Dictionary-Bytes (muss mit dem zum Kodieren verwendeten Dictionary übereinstimmen)

Gibt zurück: string, error

Trainieren Sie ein Dictionary aus Beispieldaten, um die Komprimierung vieler kleiner, ähnlicher Payloads zu verbessern. Geben Sie das trainierte Dictionary als Option dict an encode/decode weiter — für beide muss dasselbe Dictionary verwendet werden.

local dict, err = compress.zstd.train_dict(samples, { size = 112640 })
local packed = compress.zstd.encode(data, { dict = dict })
local original = compress.zstd.decode(packed, { dict = dict })
ParameterTypBeschreibung
samplesstring[]Trainingsbeispiele (mindestens eines >= 8 Bytes)
optionstable?size (integer, Ziel-Dictionary-Bytes, 256-1048576, Standard 114688), id (integer, Standard 0), level (integer, 1-22)

Gibt zurück: string, error (die Dictionary-Bytes)

ParameterTypBeschreibung
dictstringDictionary-Bytes

Gibt zurück: table, error{id: integer, content_size: integer}

Rohe DEFLATE-Komprimierung (RFC 1951). Wird intern von anderen Formaten verwendet.

local compressed = compress.deflate.encode(data, {level = 6})
ParameterTypBeschreibung
datastringZu komprimierende Daten
optionstable?Optionale Kodierungsoptionen
FeldTypBeschreibung
levelintegerKomprimierungsstufe 1-9 (Standard: 6)

Gibt zurück: string, error

local decompressed = compress.deflate.decode(compressed)
ParameterTypBeschreibung
datastringDEFLATE-komprimierte Daten
optionstable?Optionale Dekodierungsoptionen
FeldTypBeschreibung
max_sizeintegerMax. dekomprimierte Größe in Bytes (Standard: 128MB, Max: 1GB)

Gibt zurück: string, error

DEFLATE mit Header und Prüfsumme (RFC 1950).

local compressed = compress.zlib.encode(data, {level = 6})
ParameterTypBeschreibung
datastringZu komprimierende Daten
optionstable?Optionale Kodierungsoptionen
FeldTypBeschreibung
levelintegerKomprimierungsstufe 1-9 (Standard: 6)

Gibt zurück: string, error

local decompressed = compress.zlib.decode(compressed)
ParameterTypBeschreibung
datastringZlib-komprimierte Daten
optionstable?Optionale Dekodierungsoptionen
FeldTypBeschreibung
max_sizeintegerMax. dekomprimierte Größe in Bytes (Standard: 128MB, Max: 1GB)

Gibt zurück: string, error

AlgorithmusAm besten fürGeschwindigkeitRateStufenbereich
gzipHTTP, breite KompatibilitätMittelGut1-9
brotliStatische Assets, TextLangsamBeste0-11
zstdGröße Dateien, StreamingSchnellGut1-22
deflate/zlibLow-Level, spezifische ProtokolleMittelGut1-9
-- HTTP-Response basierend auf Accept-Encoding
local accept = req:header("Accept-Encoding") or ""
local body = json.encode(response_data)
if accept:find("br") then
res:set_header("Content-Encoding", "br")
res:write(compress.brotli.encode(body))
elseif accept:find("gzip") then
res:set_header("Content-Encoding", "gzip")
res:write(compress.gzip.encode(body))
else
res:write(body)
end
BedingungArtWiederholbar
Leere Eingabeerrors.INVALIDnein
Stufe außerhalb des Bereichserrors.INVALIDnein
Ungültige komprimierte Datenerrors.INVALIDnein
Dekomprimierte Größe überschreitet Limiterrors.INTERNALnein

Siehe Fehlerbehandlung für die Arbeit mit Fehlern.