Я пытаюсь сжать данные с помощью lz4_compress в php и распаковать данные с https://github.com/pierrec/lz4 на Голанге
но это не удается.
кажется, что вывод lz4_compress пропускает заголовок lz4, а данные блока немного отличаются.
Пожалуйста, помогите мне решить проблему.
<?php
echo base64_encode(lz4_compress("Hello World!"));
?>
выход:
DAAAAMBIZWxsbyBXb3JsZCE =
package main
import (
"bytes""encoding/base64""fmt""github.com/pierrec/lz4")
func main() {
a, _ := base64.StdEncoding.DecodeString("DAAAAMBIZWxsbyBXb3JsZCE=")
fmt.Printf("%b\n", a)
buf := new(bytes.Buffer)
w := lz4.NewWriter(buf)
b := bytes.NewReader([]byte("Hello World!"))
w.ReadFrom(b)
fmt.Printf("%b\n", buf.Bytes())
}
выход:
[1100 0 0 0 11000000 1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100 100001] [100 100010 1001101 11000 1100100 1110000 10111001 1100 0 0 10000000 1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100 100001]lz4.h прямо говорит
lz4.h предоставляет функции сжатия блоков. Это дает полный контроль над буфером пользователю.
Распаковка lz4-сжатого блока также требует метаданных (таких как сжатый размер). Каждое приложение может свободно кодировать такие метаданные так, как захочет.
Дополнительный формат, называемый спецификацией кадра LZ4 (doc / lz4_Frame_format.md),
позаботьтесь о кодировании стандартных метаданных вместе со сжатыми в LZ4 блоками. Если ваше приложение требует совместимости, рекомендуется использовать его. Для этого предусмотрена библиотека, см. Lz4frame.h.
Расширение PHP не делает этого; он производит голые сжатые блоки.
http://lz4.github.io/lz4/ явно указывает расширение PHP как не совместимое (в разделе «Таможенные порты и привязки LZ4»).
Звучит неплохо! А теперь попробуй
echo -n DAAAAMBIZWxsbyBXb3JsZCE= | base64 -d
Я получил в первых 4 байтах написано 0C 00 00 00 — это длина строки, а остальные Привет, мир!. Поэтому я думаю, что если php понимает, что сжатие такого короткого ввода невозможно, он записывает ввод (попробуйте echo -n "Hello World!" | lz4c
). Но проблема в том, что она не позволяет вам распознать такую вещь, или я ошибаюсь?