我在文件中有一个base64编码的八位字节字符串:
\ x7D \ X1E \ X40 \ XEE \ X62 \ X12 \ XE1 \ x9C \ xC9 \ X28 \ X63 \ X95 \ XB6 \ X0C \ XCB \ XF7 \ XD2 \ X2F \ x6F \ xA8 \ XA1 \ XF5 \ X21 \ x4E \ X7A \ x4D \ X79 \ X38 \ X78 \ XBF \ X1B \ X2B \ X73 \ X28 \ X57 \ x5C \ X8F \ XB2 \ X53 \ XC0 \ x4C \ X57 \ X6C \ X77 \ XCF \ X88 \ XA3 \ XAA \ x7D \ X52 \ XEA \ X2F \ XCD \ xE9 \ X29 \ X27 \ xD9 \ X0F \ XA1 \ XF4 \ X12 \ XDB \ XBF \ X65 \ X09 \ x4C \ X29 \ xE9 \ xC9 \ XB5 \ X0F \ X3C \ xE5 \ XEC \ X82 \ XBC \ X42 \ X3C \ XBB \ XE2 \ XFF \ x7B \ x7B \ XB1 \ X32 \ X3F \ x4D \ XC5 \ X14 \ X66 \ X69 \ X98 \ X0C \ X43 \ XB1 \ XE2 \ x9D \ 0x7F部分\ X63 \ XEF \ XF5 \ XB1 \ XEA \ XA0 \ XDC \ X58 \ x8B \ x1F的\ x9E \ XE1 \ X12 \ X14 \ XA3 \ XD2 \ X73 \ X27 \ X73 \ xE5 \ xC8 \ X2B \ XBD \ X0A \ X0B \ XE6 \ X05 \ X42 \ X36 \ X21
我想用Python阅读它。但Python会自动为我反转反斜杠,因此我得到以下字符串:
\\ x7D \\ X1E \\ X40 \\ XEE \\ X62 X12 \\ \\ XE1 \\ x9C \\ xC9 \\ X28 X63 \\ \\ X95 \\ XB6 \\ X0C \\ XCB \\ XF7 \\ XD2 \\ X2F \\ x6F \\ xA8 \\ XA1 \\ XF5 \\ X21 \\ x4E \\ X7A \\ x4D \\ X79 X38 \\ \\ X78 \\ XBF \\ X1B \\ X2B \ \ X73 X28 \\ \\ X57 \\ x5C \\ X8F \\ XB2 \\ X53 \\ XC0 \\ x4C \\ X57 \\ X6C \\ X77 \\ XCF \\ X88 \\ XA3 \\ XAA \\ x7D \\ X52 \\ XEA \\ X2F \\ XCD \\ xE9 \\ X29 X27 \\ \\ xD9 \\ X0F \\ XA1 \\ XF4 \\ X12 \\ XDB \\ XBF \\ X65 \\ X09 \\ x4C \\ X29 \\ xE9 \\ xC9 \\ XB5 \\ X0F \\ X3C \\ xE5 \\ XEC \\ X82 \\ XBC \\ X42 \\ X3C \\ XBB \\ XE2 \\ XFF \\ x7B \ \ x7B \\ XB1 \\的X32 \\ X3F \\ x4D \\ XC5 \\ X14 X66 \\ \\ X69 \\ X98 \\ X0C \\ X43 \\ XB1 \\ XE2 \\ x9D \\ 0x7F部分\\ X63 \\的XeF \\ XF5 \\ XB1 \\ XEA \\ XA0 \\ XDC \\ X58 \\ x8B \\ x1F的\\ x9E \\ XE1 \\ X12 X14 \\ \\ XA3 \\ XD2 \\ X73 \\ X27 \\ X73 \\ xE5 \\ xC8 \\ X2B \\ XBD \\ X0A \\ X0B \\ XE6 \\ X05 X42 \\ \\ X36 X21 \\
和...
>>> repr(sig_bytes)
"'\\\\x7D\\\\x1E\\\\x40\\\\xEE\\\\x62\\\\x12...'"
>>> sig_bytes.replace("\\x","\x")
ValueError: invalid \x escape
我该怎么办?
答案 0 :(得分:2)
您可能会看到字符串的repr()
版本显示在某个位置,这并不意味着您的字符串未正确加载:
>>> s = "\x7D\x1E\x40\xEE"
>>> s
'}\x1e@\xee'
>>> repr(s)
"'}\\x1e@\\xee'"
修改强>
如果您的字符串已经双重转义并且您要删除它们,请使用replace
,并且不要忘记在参数中转义\
:
sig_bytes.replace("\\\\x","\\x")
编辑2:
OP以某种方式将repr字符串加载到其字符串变量而不是正确的字符串数据。
s = "\\x7D\\x1E\\x40\\xEE"
让我们将其重新解释为OP应该从头开始加载的正确形式。为此,我们将通过用引号括起来构造字符串的完整字符串repr,然后向ast
模块询问literal_eval
它:
import ast
s = "\\x7D\\x1E\\x40\\xEE"
s = '"'+s+'"'
s = ast.literal_eval(s)
>>> s
'}\x1e@\xee'