JavaScriptを有効にしてください

PHPで作成したlz4をgolangで読み込む

 ·   ·  ☕ 1 分で読めます  ·  🐈 もふもふ

PHPで作成したlz4をgolangで読み込む

そのまま読み込むとエラーとなる

PHPで作成したlz4をgolangで読み込もうとすると下記のエラーが出る。

lz4: invalid source or destination buffer too short

PHPで作成したlz4の最初の4バイトは元のデータサイズが格納されているため、エラーが出るらしい。
下記に仕様が記載されている。
Compress Data

4バイト以降を渡すと展開してくれる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package main

import (
	"encoding/base64"
	"encoding/binary"
	"fmt"
	"net/http"

	"github.com/pierrec/lz4"
)

/*
DAAAAMBIZWxsbyBXb3JsZCE=はPHPの下記コードで出力したもの
echo base64_encode(lz4_compress('Hello World!'));
*/
func main() {
	bytes, err := base64.StdEncoding.DecodeString("DAAAAMBIZWxsbyBXb3JsZCE=")
	if err != nil {
		panic(err)
	}
	//最初の4バイトは元のサイズ
	size := binary.LittleEndian.Uint32(bytes)
	//元のサイズで領域を確保しておく
	out := make([]byte, size)
	//4バイト以降を取得
	lz4data := bytes[4:]
	n, err := lz4.UncompressBlock(lz4data, out)
	if err != nil {
		panic(err)
	}
	//データ部分を取り出す
	data := out[:n]

	fmt.Println(size, string(data))
}

結果は下記となる。

1
12 Hello World!

実行環境

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
~/$ go version
go version go1.16.5 linux/amd64

~/$ php -v
PHP 8.0.1 (cli) (built: Jan 29 2021 01:29:13) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.1, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.1, Copyright (c), by Zend Technologies

~/$ php --ri lz4

lz4

LZ4 support => enabled
Extension Version => 0.4.3
LZ4 headers Version => 1.9.2
LZ4 library Version => 1.9.2

スポンサーリンク

共有

もふもふ
著者
もふもふ
プログラマ。汎用系→ゲームエンジニア→Webエンジニア