Compressing repetitive data with gzip and getting the original back
// Compressing repetitive data with gzip and getting the original back.
import std.io.println;
import std.text.number;
import std.text.compare;
import std.text.from_bytes;
import std.text.transform;
import std.compression.gzip;
def main(): int {
let unit: string = "SultanC ";
let original_text: string = repeat_text(&unit, 50);
let original: vector u8 = bytes_from_text(clone(&original_text));
let packed: vector u8 = gzip_compress(&original);
println(uint_to_text(length(original) as uint));
if ((length(packed) as uint) < (length(original) as uint)) { println("compressed is smaller"); };
match gzip_decompress(&packed) with
| result.ok(restored) -> {
let restored_text: string = from_bytes(&restored);
if (texts_equal(&restored_text, &original_text)) { println("round trip ok"); };
}
| result.err(_) -> { println("corrupt data"); return 1; };
return 0;
}// ضغط بيانات متكررة بـgzip واستعادة الأصل.
استورد std.io.println;
استورد std.text.number;
استورد std.text.compare;
استورد std.text.from_bytes;
استورد std.text.transform;
استورد std.compression.gzip;
عرف الرئيسية(): عدد {
دع الوحدة: نص = "SultanC ";
دع النص_الأصلي: نص = كرر_النص(&الوحدة, 50);
دع الأصل_بايتات: متجه ط8 = بايتات_من_نص(استنسخ(&النص_الأصلي));
دع المضغوط: متجه ط8 = اضغط_جي_زيب(&الأصل_بايتات);
اطبع_سطر(طبيعي_إلى_نص(الطول(الأصل_بايتات) مثل طبيعي));
إذا ((الطول(المضغوط) مثل طبيعي) < (الطول(الأصل_بايتات) مثل طبيعي)) { اطبع_سطر("المضغوط أصغر"); };
طابق فك_ضغط_جي_زيب(&المضغوط) مع
| نتيجة.نجح(المستعاد) -> {
دع النص_المستعاد: نص = من_بايتات(&المستعاد);
إذا (نصان_متساويان(&النص_المستعاد, &النص_الأصلي)) { اطبع_سطر("الاستعادة سليمة"); };
}
| نتيجة.خطأ(_) -> { اطبع_سطر("بيانات تالفة"); أرجع 1; };
أرجع 0;
}
Run it
With the interpreter, without compiling:
./build/sultanc run examples/en/compression/gzip.snOr compile it to an executable:
./build/sultanc examples/en/compression/gzip.sn -o build/example && ./build/example