You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS中LZMA-JS与Java org.tukaani.xz压缩字符串结果差异问题

差异原因及兼容方案

核心差异:压缩格式类型不同

LZMA-JS默认输出原始LZMA压缩流(仅包含纯压缩数据,无容器结构),而org.tukaani.xz库和Unix xz命令默认生成的是XZ容器格式——XZ是LZMA2算法的容器规范,包含文件头、压缩索引、校验和等额外结构,这就是两者Base64结果差异巨大的根本原因。

验证方式:

  • 将JS输出的Base64解码为二进制后,执行lzma -d --format=lzma < 解码后的文件,可还原原始JSON字符串
  • 将Java输出的Base64解码为二进制后,执行xz -d < 解码后的文件,可还原原始JSON字符串

兼容实现方向

方向1:Java端生成原始LZMA流(匹配JS输出)

使用org.tukaani.xz库直接生成原始LZMA2压缩流,不包裹XZ容器,代码示例:

import org.tukaani.xz.LZMA2Options;
import org.tukaani.xz.LZMA2OutputStream;
import java.io.ByteArrayOutputStream;
import java.nio.charset.StandardCharsets;

public class LZMACompressor {
    public static String compressToRawLZMA(String input, int level) throws Exception {
        LZMA2Options options = new LZMA2Options(level);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        
        try (LZMA2OutputStream lzmaOut = new LZMA2OutputStream(baos, options)) {
            lzmaOut.write(input.getBytes(StandardCharsets.UTF_8));
        }
        
        byte[] compressedBytes = baos.toByteArray();
        return java.util.Base64.getEncoder().encodeToString(compressedBytes);
    }

    // 调用示例:compressToRawLZMA(yourJsonString, 9)
}

注意:JS中字符串默认以UTF-8编码转换为字节流,Java端必须保持一致的编码(StandardCharsets.UTF_8)。

方向2:JS端生成XZ容器格式(匹配Java/Unix输出)

如果需要JS输出和Java一致的XZ格式,需确认LZMA-JS的具体实现:

  • 若使用的是lzma-native或支持XZ的LZMA-JS分支,可调用专门的XZ压缩方法,比如compressToXZ
  • 若使用基础LZMA-Worker,不推荐手动拼接XZ容器结构(复杂度高),建议替换为支持XZ输出的LZMA库。

测试验证

完成适配后,可通过以下步骤验证兼容性:

  1. 用新代码压缩目标JSON字符串,得到Base64结果
  2. 跨语言解压:Java生成的Base64用JS的LZMA-JS解压,或JS生成的Base64用Java的org.tukaani.xz解压,确认能还原原始JSON

内容的提问来源于stack exchange,提问作者user2266565

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 18:42:51