使用jQuery $.get获取二进制文件后解压失败:invalid code length set问题排查
解决二进制文件获取与解压的"invalid code length set"错误
嘿,我一眼就看出问题出在哪了!你用$.get请求二进制文件的方式不对——jQuery默认会把响应当成文本来解析,这直接破坏了二进制数据的原始字节,后续解压自然会报格式错误。下面给你一步步解决的方案:
核心问题分析
$.get是为文本数据设计的,它会自动把响应按UTF-8编码转成字符串。但二进制文件(比如你的.hsm文件)里有很多不在UTF-8有效范围内的字节,这些字节会被替换成占位符�,导致原始数据损坏,解压时就会出现"invalid code length set"这类编码错误。
正确的二进制文件获取方式
方式1:用原生XMLHttpRequest(兼容性好)
直接指定响应类型为arraybuffer,让浏览器保留原始二进制数据:
const xhr = new XMLHttpRequest(); xhr.open('GET', 'metafile.hsm', true); xhr.responseType = 'arraybuffer'; // 关键:告诉浏览器这是二进制数据 xhr.onload = function() { if (this.status === 200) { const rawBinaryData = this.response; // 这里拿到的是ArrayBuffer类型的原始数据 readCellFile(rawBinaryData); } }; xhr.send();
方式2:用现代的Fetch API(更简洁)
Fetch原生支持二进制响应,代码更优雅:
fetch('metafile.hsm') .then(response => { if (!response.ok) throw new Error('请求失败'); return response.arrayBuffer(); }) .then(rawBinaryData => readCellFile(rawBinaryData)) .catch(err => console.error('出问题啦:', err));
方式3:如果一定要用jQuery
可以通过$.ajax的xhrFields配置强制指定响应类型:
$.ajax({ url: 'metafile.hsm', xhrFields: { responseType: 'arraybuffer' }, success: function(rawBinaryData) { readCellFile(rawBinaryData); }, error: function(xhr, status, err) { console.error('请求出错:', err); } });
修改你的readCellFile函数
现在传入的是ArrayBuffer类型的原始数据,不需要再用FileReader(除非你要转成File对象)。直接把它转成Uint8Array(大多数解压库都支持这个类型):
function readCellFile(arrayBuffer) { const uint8Data = new Uint8Array(arrayBuffer); // 这里调用你的解压逻辑,比如用pako、zlib.js等库 try { // 示例:用pako解压gzip格式的数据 const decompressedData = pako.inflate(uint8Data); // 接下来处理解压后的内容,比如转成字符串或其他格式 const content = new TextDecoder('utf-8').decode(decompressedData); console.log('解压成功:', content); } catch (err) { console.error('解压失败:', err); } }
这样处理后,原始二进制数据就不会被破坏,解压时自然就不会再报编码相关的错误啦!
内容的提问来源于stack exchange,提问作者benjist
相关产品推荐
相关产品推荐

