2

snappy-java を使用してバイト文字列を解凍しようとしています

ByteString(0xff, 0x06, 0x00, 0x00, 0x73, 0x4e, 0x61, 0x50, 0x70, 0x59, 1, 14, 0, 0, 38, -104, 43, -49, 0, 0, 0, 6, 0, 0, 0, 0, 79, 75)

これには 2 つのフレームが含まれ、最初はチャンク値 0xff (ストリーム識別子) で長さ 6 で、2 番目のフレームは長さ 14 のチャンク タイプ 1 (非圧縮) です。[こちら] ( http://code. google.com/p/snappy/source/browse/trunk/framing_format.txt )

解凍に使用するコードはこちら

val c = ByteString(0xff, 0x06, 0x00, 0x00, 0x73, 0x4e, 0x61, 0x50, 0x70, 0x59, 1, 14, 0, 0, 38, -104, 43, -49, 0, 0, 0, 6, 0, 0, 0, 0, 79, 75)
Snappy.uncompress(c.toArray)

コードは、jna の一部である FAILED_TO_UNCOMPRESS エラーをスローします。私はscala v2.11.3とsnappy-java v1.0.5.4を使用しています

Exception in thread "main" java.io.IOException: FAILED_TO_UNCOMPRESS(5)
at org.xerial.snappy.SnappyNative.throw_error(SnappyNative.java:78)
at org.xerial.snappy.SnappyNative.rawUncompress(Native Method)
at org.xerial.snappy.Snappy.rawUncompress(Snappy.java:395)
at org.xerial.snappy.Snappy.uncompress(Snappy.java:431)
at org.xerial.snappy.Snappy.uncompress(Snappy.java:407)
4

1 に答える 1

3

Failed to uncompress エラーは、Snappy.uncompress がフレーム化された入力をサポートしていないためです。フレーミング形式は最近最終決定され、実装が SnappyFramedInputStream に追加されました。ソースはここにあります

以下は、スナッピーフレームを解凍するコードです

def decompress(contents: Array[Byte]): Array[Byte] = {
    val is = new SnappyFramedInputStream(new ByteArrayInputStream(contents))
    val os = new ByteArrayOutputStream(Snappy.uncompressedLength(contents))
    is.transferTo(os)
    os.close()
    os.toByteArray
}
于 2014-10-18T14:16:08.130 に答える