从文件读取转义二进制字符串转十六进制失败的问题求助
我之前也踩过这个坑!问题根源很明确:控制台直接输入的字符串会被语言自动解析转义序列,但从文件读取的是原始字面字符串——比如你看到的\x8b会被当成四个普通字符(\、x、8、b),而不是对应的单字节值,自然转换不出正确的十六进制结果。
下面分Python和Node.js两种场景给你靠谱的解决办法:
Python 解决方案
方法1:用ast.literal_eval()安全解析转义
这个方法是Python里处理这类问题最稳妥的方式,它会把读进来的字面字符串当成Python原生字符串字面量解析,自动处理\xXX这类转义:
import ast # 读取目标文件的一行内容(根据你的实际情况调整) with open('your_input_file.txt', 'r', encoding='utf-8') as f: raw_line = f.readline().strip() # 把原始字符串包装成字符串字面量,解析转义序列 parsed_line = ast.literal_eval(f'"{raw_line}"') # 转成十六进制(用latin-1编码保证单字节映射) hex_output = '0x' + parsed_line.encode('latin-1').hex() print(hex_output) # 输出就是你要的:0x8be23d56a20530101f116c76436880f87af82509484b45f2c8921283e852d3c8
方法2:用codecs.decode()直接解码转义
如果觉得ast模块有点重,也可以用unicode_escape解码:
import codecs with open('your_input_file.txt', 'r', encoding='utf-8') as f: raw_line = f.readline().strip() parsed_line = codecs.decode(raw_line, 'unicode_escape') hex_output = '0x' + parsed_line.encode('latin-1').hex() print(hex_output)
Node.js 解决方案
方法1:用JSON.parse()快速解析转义
Node.js里可以借助JSON的字符串转义规则来处理,简单高效:
const fs = require('fs'); // 读取文件内容并去除首尾空白 const rawLine = fs.readFileSync('your_input_file.txt', 'utf8').trim(); // 把原始字符串包装成JSON格式的字符串,解析后自动处理转义 const parsedStr = JSON.parse(`"${rawLine}"`); // 转成十六进制输出 const buffer = Buffer.from(parsedStr, 'latin1'); const hexOutput = '0x' + buffer.toString('hex'); console.log(hexOutput);
方法2:用vm模块安全解析(适合复杂场景)
如果你的文件内容可能包含特殊字符,怕JSON.parse出问题,可以用vm模块在沙箱里解析,避免安全风险:
const fs = require('fs'); const vm = require('vm'); const rawLine = fs.readFileSync('your_input_file.txt', 'utf8').trim(); // 用沙箱环境解析转义字符串 const sandbox = { input: rawLine, parsed: '' }; vm.runInNewContext('parsed = String.raw`${input}`;', sandbox); const buffer = Buffer.from(sandbox.parsed, 'binary'); const hexOutput = '0x' + buffer.toString('hex'); console.log(hexOutput);
核心思路都是一致的:先把文件里的原始字面转义字符串转换成真正的字符/字节序列,再把这些字节转换成十六进制格式。
内容的提问来源于stack exchange,提问作者Dmitry Kotlyar
相关产品推荐
相关产品推荐

