转换过程:
'\xe4\xb8\xad\xe6\x96\x87'(含转义符的十六进制表示的字符串)
b'\\xe4\\xb8\\xad\\xe6\\x96\\x87'(保留转义符的字节码类型)
'\\xe4\\xb8\\xad\\xe6\\x96\\x87'(保留转义符的字符串类型)
'e4b8ade69687'(删除'\\x'后的字符串)
b'\xe4\xb8\xad\xe6\x96\x87'(正常的字节码)
'中文'(用对应字符集解码的字符串)
def 含转义符的十六进制表示的字符串解码(STR16, 字符集='utf8'):
BUE = STR16.encode('unicode-escape') # 示例:'\xe4\xb8\xad\xe6\x96\x87' 转为 b'\\xe4\\xb8\\xad\\xe6\\x96\\x87'
S = BUE.decode() # 示例:b'\\xe4\\xb8\\xad\\xe6\\x96\\x87' 转为 '\\xe4\\xb8\\xad\\xe6\\x96\\x87'
S_NEW = S.replace('\\x', '') # 示例:'\\xe4\\xb8\\xad\\xe6\\x96\\x87' 转为 'e4b8ade69687'
S2B = bytes.fromhex(S_NEW) # 示例:'e4b8ade69687' 转为 b'\xe4\xb8\xad\xe6\x96\x87'
S_TEXT = S2B.decode(字符集) # 示例:b'\xe4\xb8\xad\xe6\x96\x87' 转为 '中文'
print(f"转换过程与结果: {STR16} -> {S} -> {S_NEW} -> {S2B} -> {S_TEXT}")
return(S_TEXT)
def ASCII码和含转义符的十六进制表示的中文字符的混合字符串解码(STR, 字符集='utf8'):
from io import StringIO
MSF = StringIO() # 创建内存字符串文件类型,方便按顺序逐个字符读取
BUE = STR.encode('unicode-escape') # 把所有内容转成bytes(可以把转义符当普通字符转换)示例:'\xe4\xb8\xad\xe6\x96\x87' 转为 b'\\xe4\\xb8\\xad\\xe6\\x96\\x87'
MSF.write(BUE.decode(字符集)) # 编码后转成文本(转成任何字符集都行,结果都一样) 示例:b'\\xe4\\xb8\\xad\\xe6\\x96\\x87' 转为 '\\xe4\\xb8\\xad\\xe6\\x96\\x87'
##L_DEBUG = []
L_STR = [] # 存放按顺序解析后的内容
MSF.seek(0) # 内存文件定位到开头
S_ASCII = '' # 遇到 ASCII 字符拼接起来
S_HEX = '' # 遇到 HEX 形式的字符拼接起来
while 1: # 循环读取
S = MSF.read(1) # 一次读取1字符,如:'0' , '1' , 'A' , 'a' , '字' , '\n'
##print("一次读取内容:", S)
if not S: # 当 S 为空(读完或者本身为空时 S 为空)
if S_ASCII != '':
print(f"END S_ASCII={S_ASCII}")
##L_DEBUG.append(S_ASCII)
L_STR.append(S_ASCII)
if S_HEX != '':
try:
S2B = bytes.fromhex(S_HEX) # 把前面收集到的 HEX 部分字符串转成Bytes字节类型,例:'aabbcc' 转成 b'\xaa\xbb\xcc'
except:
S_TEXT = f'解码失败,非{字符集}字符集'
S_TEXT = S2B.decode(字符集) # 把前面收集到的 HEX 部分用字符集解码
print(f"END S_HEX={S_HEX} S_TEXT={S_TEXT}")
##L_DEBUG.append(S_HEX)
L_STR.append(S_TEXT)
break # 退出循环
if S == '\\':
## 遇到转义符了,后面可能是 HEX 部分了,把前面收集到的 ASCII 部分保存起来
if S_ASCII != '':
print(f"S_ASCII={S_ASCII}")
##L_DEBUG.append(S_ASCII)
L_STR.append(S_ASCII) # 把前面收集到的 ASCII 部分保存起来
S_ASCII = '' # 重置为空
X = MSF.read(1) # 再往后读取1字符
if X == 'x': # 如果'x',那就是'\x',后面应该就是16进制表示的实际值了
HEX2 = MSF.read(2) # 再往后读2字符
S_HEX += HEX2 # 拼接到 S_HEX
else:
print(f"PASS =\\{X}") # 可能是转义符本身或者 \r \n 之类的,在这里直接忽略
else:
## 不是转义符了,后面应该是 ASCII 部分了,把前面收集到的 HEX 部分解析并保存起来
if S_HEX != '':
S2B = bytes.fromhex(S_HEX) # 把前面收集到的 HEX 部分字符串转成Bytes字节类型,例:'aabbcc' 转成 b'\xaa\xbb\xcc'
try:
S_TEXT = S2B.decode(字符集) # 把前面收集到的 HEX 部分用字符集解码
except:
S_TEXT = f'解码失败,非{字符集}字符集'
print(f" S_HEX={S_HEX} S_TEXT={S_TEXT}")
##L_DEBUG.append(S_HEX)
L_STR.append(S_TEXT) # 保存起来
S_HEX = '' # 重置为空
S_ASCII += S # 本值拼接到 S_ASCII
print()
##print(L_DEBUG)
print(L_STR) # ASCII字符和HEX字符解析后内容按顺序组成的列表
print()
ALL_TEXT = ''.join(L_STR) # 拼接成一行
print(ALL_TEXT)
return(ALL_TEXT)
STR16 = '\xe4\xb8\xad\xe6\x96\x87' # 16进制格式的字符串
S_ASCII_HEX = 'HTTP/1\.1\x20200\x20\r\ntest=\"\xe4\xb8\xad\xe6\x96\x87_\xe6\xb1\x89\xe5\xad\x97\"\xe5\xad\x97\xe7\xac\xa6\xe9\x9b\x86=utf8'
含转义符的十六进制表示的字符串解码(STR16)
ASCII码和含转义符的十六进制表示的中文字符的混合字符串解码(S_ASCII_HEX)