bytesarray的定义
bytesarray没有像bytes的b’'的快捷方式,只能用bytesarrary()
>>> bytearray() # 可变的数组
bytearray(b'')
>>> b10 = bytearray(b"")
>>> b10
bytearray(b'')
>>> bytearray("abc".encode()) #一般很少用这个
bytearray(b'abc')
>>> bytearray('abc','gbk')
bytearray(b'abc')
>>> bytearray(5)
bytearray(b'\x00\x00\x00\x00\x00')
>>> bytearray(range(65,70))
# 所以,当如果你想对一个bytes进行修改,可以先用bytearray包一下
bytearray(b'ABCDE')
>>> a= bytearray.fromhex('656667')
>>> a
bytearray(b'efg')
>>> a.hex()
'656667'
>>> for x in a:
>>> print(type(x),x)
<class 'int'> 101
<class 'int'> 102
<class 'int'> 103
>>> a[0] = b's' #这样会报错,因为a[0]要求是整数类型
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-10-104b99f818a9> in <module>
----> 1 a[0] = b's' #这样会报错,因为a[0]要求是整数类型
TypeError: 'bytes' object cannot be interpreted as an integer
>>> a[0] = 99
>>> a
>>> for x in a:
>>> print(type(x),x, hex(x))
bytearray的方法
>>> a
>>> a.insert(0,100)
>>> a
>>> a.append(101)
>>> a
>>> a.extend(b'abc') #虽然extend可以这样用,但我们一般不
>>> a
>>> a.extend(range(120,123))
>>> a
>>> a.find(b"xya") # 这个方法有点像字符串
>>> a.remove(120)
>>> a
>>> a.pop()
>>> a
>>> a.reverse()
>>> a
字节序
- 字符串采用了大端模式Big endian,尾巴字符往高地址放
- int类型,以c语言为例子
-
1字节,无所谓大小端
-
2字节,尾巴放在低地址端,就是小端模式,LSB:Least Significant Bit(最低有效位);尾巴放在大地址端,就是大端模式,MSB:Most Significant Bit(最高有效位)。
-
大端模式, big-endian;小端模式, little-endian
-
Intel X86 CPU使用小端模式
-
网络传输更多使用大端模式
-
Windows, Linux使用小端模式
-
Mac OS使用大端模式
-
ava A机端模式
>>> a = 0x616263 # 定义的整型,61是高字节,在低地址;63是低字节,在高地址
>>> type(a),hex(a),a # 16进制表达的 ,不是字符串
如何把整形变成bytes字节序列,即把0x616263,变成b"\x616263"?
如下:
>>> a.to_bytes(3,"big") # int->byte
计算机内部,int和byte是可以直接转的,如果要转到字符串,就需要间接的转化:
>>> a.to_bytes(3,"big").decode() # int->byte ->decode() str
- PS: 在内存中是无差别的0和1,当你赋予了数据类型之后,计算机才能理解0和1是什么;
- 如何你定义为字符串,那计算机就当字符串看,那就与编码表有关;如果你定义为整型那就会当做整型,那你就要提供是几个字节,以及字节序;
用16进制字符串获得bytes
>>> int.from_bytes(b'abc',"big") # bytes-> int
>>> hex(int.from_bytes(b'abc',"big")) #转化成16进制
也可这样转:
>>> b = bytearray()
>>> b.append(0x61)
>>> b
>>> b.extend(b'bc')
>>> b
>>> int.from_bytes(b,'big')
>>> hex(int.from_bytes(b,'big'))