含转义符的十六进制表示的字符串解码成普通字符串

转换过程:
'\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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值