如何将REST API返回的十六进制Buffer转换为tar文件并提取内容?
问题解答
能否将Buffer十六进制转换为tar文件?
可以,但首先要明确:你当前收到的Buffer开头4d 4d 00 2a是TIFF图片文件的标识(对应ASCII的MM*,是大端TIFF的魔数),这说明接口返回的大概率不是tar文件,而是其他格式内容。
先排查问题根源
- 校验响应类型:在
resCallback里添加日志打印response.headers['content-type'],确认返回的是否为application/x-tar或application/octet-stream。如果是image/tiff这类格式,说明接口本身就没返回tar文件,需要和接口提供方确认。 - 检查请求参数:你用
req.write(JSON.stringify(body))发送JSON请求体,确认接口是否要求该格式,参数是否正确——参数错误可能导致接口返回错误内容。
若确认是tar文件的处理方法
如果后续确认收到的Buffer确实是tar文件字节流,直接将Buffer写入文件即可:
// 在onResult回调中处理返回的buffer const fs = require('fs'); fs.writeFileSync('output.tar', buffer);
提取内容可使用系统tar命令:
tar -xf output.tar
或用Node.js的tar-fs包实现代码提取:
const tar = require('tar-fs'); const fs = require('fs'); tar.extract('./extracted').end(buffer);
代码优化建议
当前拼接Buffer的逻辑没问题,但可以新增响应类型日志,方便快速排查:
const resCallback = (response) => { // 新增:打印响应Content-Type console.info("Response Content-Type:", response.headers['content-type']); if (response.statusCode < 200 || response.statusCode > 299) { console.error(errorTag,"Did not get an OK from the server. Code:",response.statusCode); console.error(errorTag,"Did not get an OK from the server. Msg:",response.statusMessage); onResult(response.statusCode, null); response.resume(); return; } let data = []; response.on('data', (chunk) => { data.push(chunk); }); response.on('end', () => { const buffer = Buffer.concat(data); console.info({msg:infoTag +' response ended',contents:buffer}); onResult(response.statusCode, buffer, null); }); }
内容的提问来源于stack exchange,提问作者Amr
相关产品推荐
相关产品推荐

