python 如何将原始字符串转换为十六进制?
How python converts raw string to hex?
我有一些原始字符串,我正在将其转换为十六进制
>>> word_str = "4954640000005200000005a7a90fb36ecd3fa2ca7ec48ca36004acef63f77157ab2f53e3f768ecd9e18547b8c22e21d01bfb6b3de325a27b8fb3acef63f77157ab2f53e3f768ecd9e185b7330fb7c95782fc3d67e7c3a66728dad8b59848c7670c94b29b54d2379e2e7a"
>>> hex_str = word_str.decode('hex')
>>> hex_str = "ITd\x00\x00\x00R\x00\x00\x00\x05\xa7\xa9\x0f\xb3n\xcd?\xa2\xca~\xc4\x8c\xa3`\x04\xac\xefc\xf7qW\xab/S\xe3\xf7h\xec\xd9\xe1\x85G\xb8\xc2.!\xd0\x1b\xfbk=\xe3%\xa2{\x8f\xb3\xac\xefc\xf7qW\xab/S\xe3\xf7h\xec\xd9\xe1\x85\xb73\x0f\xb7\xc9W\x82\xfc=g\xe7\xc3\xa6g(\xda\xd8\xb5\x98H\xc7g\x0c\x94\xb2\x9bT\xd27\x9e.z"
通过查看 ascii table 我想它一次需要两个数字并通过 ascii table like
的适当值转换它们
49 -> I
54 -> T
64 -> d
00 -> \x00
00 -> \x00
但在某些时候这条规则会被打破
52 -> \x00R (00 and 52)
然后一次取两个数字,
00 -> \x00
00 -> \x00
00 -> \x00
05 -> \x05
a7 -> \xa7
a9 -> \xa9
0f -> \x0f
这里它同时需要 2 对(b3
和 63
)而不是一对,其中它不会将 b3
转换为适当的值(来自扩展的 ascii table)
b36e -> \xb3n
这里cd变成了\xcd?
...
cd -> \xcd?
我的目标是在 C++ 中实现相同的 (variable.decode('hex')),但我需要了解发生了什么,这里使用了哪种算法?
您要问的是字符串的表示,以便以人类可读的格式打印它。字符串本身包含原始十六进制字符串中每个字节的值(每个字节都来自两个原始数字)。
您的字符串中的某些字节是不可打印的字符或无法用 ASCII 表示的字符。对于那些,Python 使用转义码:\x
后跟两个原始的十六进制数字。
在您的示例 b36e -> \xb3n
中,Python 将 b3
转换为 \xb3
。下一个字节 6e
是小写字母 n
的 ASCII,因为它是可打印的,所以它是逐字记录的。 Python不是"taking them two at a time;"每个字节单独处理。
所以基本上,如果你想在 C++ 中 "do the same thing" 那么你会想要逐字添加 32 到 126(含)之间的所有字符,以及使用 \x
转义符添加该范围之外的任何字符。
虽然我不确定您是否真的想在 C++ 中做同样的事情;也许你可以解释 为什么 你想在 C++ 中生成 Python 字符串表示。
我有一些原始字符串,我正在将其转换为十六进制
>>> word_str = "4954640000005200000005a7a90fb36ecd3fa2ca7ec48ca36004acef63f77157ab2f53e3f768ecd9e18547b8c22e21d01bfb6b3de325a27b8fb3acef63f77157ab2f53e3f768ecd9e185b7330fb7c95782fc3d67e7c3a66728dad8b59848c7670c94b29b54d2379e2e7a"
>>> hex_str = word_str.decode('hex')
>>> hex_str = "ITd\x00\x00\x00R\x00\x00\x00\x05\xa7\xa9\x0f\xb3n\xcd?\xa2\xca~\xc4\x8c\xa3`\x04\xac\xefc\xf7qW\xab/S\xe3\xf7h\xec\xd9\xe1\x85G\xb8\xc2.!\xd0\x1b\xfbk=\xe3%\xa2{\x8f\xb3\xac\xefc\xf7qW\xab/S\xe3\xf7h\xec\xd9\xe1\x85\xb73\x0f\xb7\xc9W\x82\xfc=g\xe7\xc3\xa6g(\xda\xd8\xb5\x98H\xc7g\x0c\x94\xb2\x9bT\xd27\x9e.z"
通过查看 ascii table 我想它一次需要两个数字并通过 ascii table like
的适当值转换它们49 -> I
54 -> T
64 -> d
00 -> \x00
00 -> \x00
但在某些时候这条规则会被打破
52 -> \x00R (00 and 52)
然后一次取两个数字,
00 -> \x00
00 -> \x00
00 -> \x00
05 -> \x05
a7 -> \xa7
a9 -> \xa9
0f -> \x0f
这里它同时需要 2 对(b3
和 63
)而不是一对,其中它不会将 b3
转换为适当的值(来自扩展的 ascii table)
b36e -> \xb3n
这里cd变成了\xcd?
...
cd -> \xcd?
我的目标是在 C++ 中实现相同的 (variable.decode('hex')),但我需要了解发生了什么,这里使用了哪种算法?
您要问的是字符串的表示,以便以人类可读的格式打印它。字符串本身包含原始十六进制字符串中每个字节的值(每个字节都来自两个原始数字)。
您的字符串中的某些字节是不可打印的字符或无法用 ASCII 表示的字符。对于那些,Python 使用转义码:\x
后跟两个原始的十六进制数字。
在您的示例 b36e -> \xb3n
中,Python 将 b3
转换为 \xb3
。下一个字节 6e
是小写字母 n
的 ASCII,因为它是可打印的,所以它是逐字记录的。 Python不是"taking them two at a time;"每个字节单独处理。
所以基本上,如果你想在 C++ 中 "do the same thing" 那么你会想要逐字添加 32 到 126(含)之间的所有字符,以及使用 \x
转义符添加该范围之外的任何字符。
虽然我不确定您是否真的想在 C++ 中做同样的事情;也许你可以解释 为什么 你想在 C++ 中生成 Python 字符串表示。