Python3的新類型:Bytesarray和初識字節序

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

字節序

  1. 字符串採用了大端模式Big endian,尾巴字符往高地址放
  2. 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'))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章