A-A+

python3 16进制字符串、列表、bytes和bytearray之间的转换

2021年07月09日 23:39 汪洋大海 暂无评论 阅读 36 views 次

在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”) ->str

    b'qwe'.decode() >>>'qwe'

    bytearray.decode(encoding=“utf-8”,errors=“strict”) ->str

    bytearray(b'qwe').decode() >>>'qwe'

ASCII码

  • ASCII,美国信息交换标准代码,是基于拉丁字母的一套单字节编码系统
  • python3 16进制字符串、列表、字符串之间的转换

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

布施恩德可便相知重

微信扫一扫打赏

支付宝扫一扫打赏

×

给我留言