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
相关产品推荐
相关产品推荐

