项目场景:
我们在用python分析流量时常常会需要对获取到的16进制报文进行中文翻译。
以下是我在学习过程中遇到的问题,记录学习,供参考。
字节:
字节(Byte)是计算机信息技术用于计量存储容量的一种计量单位,也表示一些计算机编程语言中的数据类型和语言字符,一个字节存储8位无符号数,储存的数值范围为0-255。如同字元一样,字节型态的变数只需要用一个位元组(8位元)的内存空间储存。
字符字节:
字节ASCII码:一个英文字母(不分大小写)占一个字节的空间,一个中文 汉字占两个字节的空间。一个 二进制数字序列,在 计算机中作为一个数字单元,一般为8位二进制数,换算为 十进制。最小值0,最大值255。如一个ASCII码就是一个字节。
UTF-8编码:一个英文 字符等于一个字节,一个中文(含繁体)等于三个字节。
Unicode编码:一个英文等于两个字节,一个中文(含繁体)等于两个字节。
符号:英文 标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号“。”占2个字节的大小。
问题描述
网给出得解决的方案大多数是:
a = 'i am request,\xE6\x88\x91\xE6\x98\xAF\xE8\xAF\xB7\xE6\xB1\x82'.decode('utf-8').encode('utf-8')
print(a)
结果:
原因分析:
s.decode()方法中 s必须为 bites 类型
思路:
二进制转换
binascii.b2a_hex(data)和binascii.hexlify(data):返回二进制数据的十六进制表示。每个字节被转换成相应的2位十六进制表示形式。因此,得到的字符串是是原数据长度的两倍。
binascii.a2b_hex(hexstr) 和binascii.unhexlify(hexstr):从十六进制字符串hexstr返回二进制数据。是b2a_hex的逆向操作。 hexstr必须包含偶数个十六进制数字(可以是大写或小写),否则报TypeError。
解决方案:
- 对于带有'\x'的采用 s.decode()方法即可
a=b"\xe4\xbd\xa0\xe5\xa5\xbd" #字符串前加 b str即可变为bites
print(a.decode())
结果:
- 不带'\x',调用 binascii 模块,将"e4bda0e5a5bd" 转化为 b'\xe4\xbd\xa0\xe5\xa5\xbd' 形式,再用decode()进行转化。
用法可查看官方文档https://docs.python.org/zh-cn/3/library/binascii.html?highlight=binascii
b="e4bda0e5a5bd" # 十六进制不带 '\x' string 类型
#以下两个均可用
print(binascii.unhexlify(b))
#结果为: b'\xe4\xbd\xa0\xe5\xa5\xbd'
nn=binascii.unhexlify(b).decode()
#nn=binascii.a2b_hex(b).decode()
print(nn)
结果:
可能出现的问题
完美解决!