0

我尝试在 php 中使用 lz4_compress 压缩数据,并在 golang中使用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 11001 1100 0 0 0 10000000 1001000 1100101 1101100 1101100 11011111111111111111111111111111111111111111111111111111111111111111111111起1100100 100001]]

4

2 回答 2

2

lz4.h明确表示

lz4.h 提供块压缩功能。它为用户提供了完整的缓冲区控制。

解压缩 lz4 压缩块还需要元数据(例如压缩大小)。每个应用程序都可以自由地以任何它想要的方式对这些元数据进行编码。

一种称为 LZ4 帧规范 (doc/lz4_Frame_format.md) 的附加格式负责编码标准元数据以及 LZ4 压缩块。如果您的应用程序需要互操作性,建议使用它。提供了一个库来处理它,请参阅 lz4frame.h。

PHP 扩展不这样做;它产生裸压缩块

http://lz4.gi​​thub.io/lz4/明确将 PHP 扩展列为不可互操作(在“海关 LZ4 端口和绑定”部分)。

于 2017-10-26T08:27:07.607 回答
0

听起来不错!现在试试

echo -n DAAAAMBIZWxsbyBXb3JsZCE= | base64 -d

我得到的前 4 个字节写成 0C 00 00 00 - 这是字符串的长度,其余的是Hello World!. 因此,我认为,如果 php 意识到无法压缩如此短的输入,它会写入输入(try echo -n "Hello World!" | lz4c)。但问题是它不允许你承认这样的事情,还是我错了?

于 2017-10-25T22:30:39.533 回答