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

Zstd解压Java HashMap序列化二进制文件时遇“Unknown frame descriptor”错误的解决求助

Zstd解压Java HashMap序列化二进制文件时遇“Unknown frame descriptor”错误的解决求助

我手头有一个二进制文件,它原本应该是Java HashMap序列化生成的。文件的大部分内容看起来是Zstandard压缩的归档数据,十六进制开头如下:

00000000 28 B5 2F FD:00 58 9D 21|00 16 BC D4:4B B0 56 55
00000010 3A 52 74 EB:D5 B9 A7 C3|FD 38 04 39:ED EC 86 F3
00000020 C7 08 8F 4C:77 82 FA D7|10 47 EC 77:73 23 B7 D0
00000030 E6 D0 27 01:D9 08 D4 F5|37 52 38 66:1C 26 B1 71
00000040 0A 24 95 8B:A4 26 58 B6|C5 8D 0B 92:36 A5 F0 D2
00000050 D1 15 BC F7:D7 FF 4F 01|BE 00 BC 00:C2 00 17 F0
00000060 DF C5 04 F3:FF BF 60 41|58 EC A1 2A:70 BD 18 98
00000070 C9 9B 58 CD:3C 7B EB 59|15 7D FD A6:FA 6A 09 0A
00000080 03 46 8A 3C:01 C0 12 DA|1C 70 B5 1C:4A F4 CC C4

这里能清楚看到Zstd的魔数28 B5 2F FD。我用hexedit检查了整个文件,发现里面有多处Zstd魔数,推测可能是多个归档文件拼接在一起的。

首先我尝试用系统自带的Zstd工具:先执行sudo apt install zstd安装,然后用zstd -d zstandardblock.zst解压,结果报错:

zstandardblock.zst : 0 B... zstd: zstandardblock.zst: unsupported format

之后我写了一个Python脚本,尝试分块解码:

import zstandard as zstd

def decompress_until_error(input_file, output_prefix, chunk_size=65536):
    """Decompress a Zstd file in large chunks until an error occurs, writing each chunk to separate files."""
    with open(input_file, "rb") as compressed:
        dctx = zstd.ZstdDecompressor()
        reader = dctx.stream_reader(compressed)
        chunk_index = 0
        try:
            while True:
                chunk = reader.read(chunk_size)
                if not chunk:
                    # Stop if no more data
                    break
                # Check for skippable frame marker (0x184D2A50)
                if chunk[:4] == b'\x50\x2A\x4D\x18':
                    print(f"Skippable frame detected at chunk {chunk_index}, skipping...")
                    continue
                output_file = f"{output_prefix}_{chunk_index}.bin"
                with open(output_file, "wb") as f:
                    f.write(chunk)
                print(f"Chunk {chunk_index}: {len(chunk)} bytes written to {output_file}")
                chunk_index += 1
        except zstd.ZstdError as e:
            print(f"Zstandard error encountered after {chunk_index} chunks: {e}")
        except Exception as e:
            print(f"Unexpected error encountered after {chunk_index} chunks: {e}")
    print("Decompression halted due to an error.")

# Example usage
decompress_until_error("zstandardblock.zst", "final_output")

这个脚本很基础,就是读取文件分块处理。奇怪的是,我确实提取出了一个损坏的Java HashMap,说明这个Zstd块里确实有有效数据,但脚本运行到最后报错:

Chunk 0: 2098 bytes written to final_output_0.bin
Zstandard error encountered after 1 chunks: zstd decompress error: Unknown frame descriptor
Decompression halted due to an error.

我确信这个归档里有可用的信息,有没有什么Zstd的参数设置,或者修改二进制数据的方法,能让我成功解压它?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 07:18:06