python3 16进制字符串、列表、bytes和bytearray之间的转换
在Python操作数据内容时,多数情况下可能遇到下面3种类型的数据处理:
hexstring 如:'1C532145697A8B6F'
str 如:'\x1C\x53\x21\x45\x69\x7A\x8B\x6F'
list 如:[0x1C, 0x53, 0x21, 0x45, 0x69, 0x7A, 0x8B, 0x6F]
各种第三方模块(如pyDes),或者自己写的接口中,可能存在由于类型不统一需要在这3种数据中来回切换的情况。
bytes and bytearray
- Python3引入两新类型
1. bytes:不可变的字节序列
2. bytearray:字节组,是可变的 - 字符串与bytes
1. 字符串是字符组成的有序序列,字符可以使用编码来理解
2. bytes是字节组成的有序的不可变的序列
3. bytrarray是字节组成的有序的可变是序列 - 编码与解码
1. 字符串按照不同的字符集编码,encode返回字节序列bytes;
encode(encoding=‘utf-8’,errors=‘strict’) ->bytes'qwe'.encode() >>>b'qwe'
2. 字节序列按照不同的字符集解码,decode返回字符串
bytes.decode(encoding=“utf-8”,errors=“strict”) ->strb'qwe'.decode() >>>'qwe'
bytearray.decode(encoding=“utf-8”,errors=“strict”) ->str
bytearray(b'qwe').decode() >>>'qwe'
ASCII码
- ASCII,美国信息交换标准代码,是基于拉丁字母的一套单字节编码系统
bytes定义
- bytes() 空bytes
- bytes(int) 指定字节的bytes,被0填充
bytes(3) >>>b'\x00\x00\x00'
- bytes(iterable_of_ints) -> bytes [0,255]的int组成的可迭代对象
bytes(range(5)) >>>b'\x00\x01\x02\x03\x04'
bytes([1,3,6]) >>>b'\x01\x03\x06'
- bytes(string,encoding[,errors])->bytes等价于string.encode()
- bytes(bytes_or_buffer)->immutable copy of bytes_or_buffer,从一个字节序列或者buffer复制出一个新的不可变的bytes对象
- 使用b前缀定义
只允许基本的ASCII使用的字符b’abc9’
使用十六进制表示b"\x41\x61
bytes 操作
- 和str类型类似,都是不可变类型,所以方法很多都是一样.只不过bytes的方法,输入的是bytes,输出的也是byters
b'abcdef'.replace(b'f',b'k') >>> b'abcdek'
- 类方法 bytes.fromhex(string)
string必须是2个字节的16进制的形式,‘6161 6a 6b’,空格将被忽略bytes.fromhex('6161 6a 6b') >>>b'aajk'
- 返回16进制的字符串
‘abc’.encode().hex
例如:'abc'.encode().hex() >> '616263'
- 索引
b’abce’[2],返回该字节对应的数,int类型
byterarray
- 定义
bytearray()空bytearray
byteraray(int)指定字节的bytearray,被0填充
bytearray(iterable_of_ints)->bytearray [0,255]的int组成的可迭代对象
bytearray(string,encoding[,error])->bytearray 近视string.encode(),不过返回可变对象
注意b前缀定义的类型是bytes类型
bytearray操作
- 和bytes类型的方法相同
bytearray(b'abcd').replace(b'd',b'k') >>>bytearray(b'abck')
bytearray(b'abc').find(b'b') >>>1
- 类方法bytearray.fromhex(string)
string必须是2个字符的16进制的形式,‘6162 6a 6b’,空格将被忽略bytearray.fromhex('6162 6a 6b') >>>bytearray(b'abjk')
返回16进制表示的字符串
bytearray('abc'.encode()).hex() >>>'616263'
- 索引
bytearray(b'abcdef')[2] >>99
返回该字节对应的数,int型
- append(int),尾部追加一个元素
b = bytearray(b'qw')
b.append(97)
print(b)
>>>bytearray(b'qwa')
----------------------
b = bytearray(b'qw')
b.append(0x41)
print(b)
>>>bytearray(b'qwA')
- insert(index,int)在指定索引位置插入元素
- extend(iterable_of_ints)将一个可迭代的集合追加到当前的bytearray
- pop(index=-1)从指定位置索引上移除元素默认尾部移除
b = bytearray(b'qwa' )
b.pop(1)
>>>119
- remove(value)找到第一个value移除,找不到抛valueError异常
- 注意:上述方法若需要使用int类型,则值在[0,255]
- clear()清空bytearray
- reverse()翻转bytearray,就地修改
int和bytearray (数字与字节数的相互转化)
- int.from_bytes(bytes,byteorder)
将一个字节数组表示成整数 (把字节数用数字,十进制表示) - int.to_bytes(length,byteorder)
byteorder字节序
将一个整数表达成一个指定长度的字节数组 (把数字用字节数表示)
文章来源:https://www.pianshen.com/article/8114313106/
需要用到的核心的方法如下:
list() 将对象转换为list
str() 将对象转换为str
bytearray() 将对象转换为bytearray
bytearray.fromhex() 将对象从hexstring转换为bytearray
binascii.b2a_hex() 将对象从str转换为hexstring
1. 整形列表转str
如:[0x53, 0x21, 0x6A] -> '\x53\x21\x6a'
方法:list -> bytearray -> str
x = [0x53, 0x21, 0x6A]
y = str(bytearray(x))
2. str转整形列表
如:'\x53\x21\6a' -> [0x53, 0x21, 0x6A]
方法:逐个字符转成十进制
x = '\x53\x21\x6a'
y = [ord(c) for c in x]
3. 整形列表转换为hex string
如: [0x53, 0x21, 0x6A] -> '53216A'
方法:list -> bytearray -> str -> hexstring
import binascii
x = [0x53, 0x21, 0x6A]
y = str(bytearray(x))
z = binascii.b2a_hex(y)
4. hex string转换为整形列表
如: '53216A' -> [0x53, 0x21, 0x6A]
方法:hexstring -> bytearray -> list
x = '53216A'
y = bytearray.fromhex(x)
z = list(y)
5. hex string转换为str
如: '53216A' -> '\x53\x21\x6A'
方法:hexstring -> bytearray -> str
x = '53216A'
y = bytearray.fromhex(x)
z = str(y)
以
作者:零岁的我
链接:https://www.jianshu.com/p/7136b47fdd33
布施恩德可便相知重
微信扫一扫打赏
支付宝扫一扫打赏