Java 如何使用LWJGL';要压缩和解压缩的s LZ4绑定

Java 如何使用LWJGL';要压缩和解压缩的s LZ4绑定,java,lwjgl,Java,Lwjgl,我正在尝试创建两个助手方法,一个用于压缩,另一个用于解压缩。这些方法应该使用LWJGL的LZ4绑定来完成压缩/解压缩 它们大部分已经可以工作了,但是解压缩后返回的字节数组有尾随的零 import static org.lwjgl.util.lz4.LZ4.LZ4_compressBound; import static org.lwjgl.util.lz4.LZ4.LZ4_compress_default; import static org.lwjgl.util.lz4.LZ4.LZ4_dec

我正在尝试创建两个助手方法,一个用于压缩,另一个用于解压缩。这些方法应该使用LWJGL的LZ4绑定来完成压缩/解压缩

它们大部分已经可以工作了,但是解压缩后返回的字节数组有尾随的零

import static org.lwjgl.util.lz4.LZ4.LZ4_compressBound;
import static org.lwjgl.util.lz4.LZ4.LZ4_compress_default;
import static org.lwjgl.util.lz4.LZ4.LZ4_decompress_safe;

import java.nio.ByteBuffer;

public static byte[] compress(byte[] data) {
    ByteBuffer buffer = BufferUtils.createByteBuffer(data.length);
    for (int i = 0; i < data.length; i++) {
        buffer.put(data[i]);
    }
    buffer.flip();

    ByteBuffer destination = BufferUtils.createByteBuffer(LZ4_compressBound(buffer.remaining()));
    destination.clear();

    LZ4_compress_default(buffer, destination);

    return getByteArrayFromByteBuffer(destination);
}

public static byte[] decompress(byte[] data) {
    ByteBuffer buffer = BufferUtils.createByteBuffer(data.length);
    for (int i = 0; i < data.length; i++) {
        buffer.put(data[i]);
    }
    buffer.flip();

    ByteBuffer destination = BufferUtils.createByteBuffer(LZ4_compressBound(buffer.remaining()));
    destination.clear();

    LZ4_decompress_safe(buffer, destination);

    return getByteArrayFromByteBuffer(destination);
}

public static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) {
    byte[] bytesArray = new byte[byteBuffer.remaining()];
    byteBuffer.get(bytesArray, 0, bytesArray.length);
    return bytesArray;
}
import static org.lwjgl.util.lz4.lz4.lz4\u compressBound;
导入静态org.lwjgl.util.lz4.lz4.lz4\u压缩\u默认值;
导入静态org.lwjgl.util.lz4.lz4.lz4\u解压\u安全;
导入java.nio.ByteBuffer;
公共静态字节[]压缩(字节[]数据){
ByteBuffer buffer=BufferUtils.createByteBuffer(data.length);
对于(int i=0;i
运行压缩(解压缩(某些数据))后的结果, is:[一些数据,0,0,0]

数据的前半部分是正确的,但由于某些原因,添加了额外的零。这可能是因为ByteBuffers没有正确设置,但我不确定。无论哪种方式,我如何删除这些额外的零


同样不幸的是,这是我能找到的唯一一个显示该如何工作的示例的链接。

首先,在压缩过程中,您当前正在使用的结果定义目标缓冲区的初始容量。虽然这是正确的,但您必须记住,这只是压缩数据的最坏大小。写入的实际字节数是所述函数的返回值,很可能小于绑定值。因此,您需要调整目标缓冲区以匹配该大小

int compressedSize=LZ4\u compress\u默认值(缓冲区、目标);
目的地。限制(压缩大小);
destination=destination.slice();
此外,解压缩过程中还存在类似的错误: 您不能使用
LZ4\u compressBound(…)
计算目标缓冲区的容量。相反,您需要将解压缩数据的大小存储在其他位置。(理论上,您可以使用
compressedSize*255
,但这是非常不实际的,因为压缩比几乎从未达到,因此会导致大量资源浪费。) 同样,您需要考虑返回值,返回值是解压缩数据的实际大小