python數據類型 ——bytes 和 bytearray

bytes和 bytearray

bytes:可以看作是一組二進制數值(0-255) 的 str 序列
bytearray :可以看作是一組二進制數值(0-255) 的 list 序列

bytes類型

字符串轉bytes類型

# 將返回 bytes 類型 b" abc "
bs1 = bytes("abc","utf-8")
# 可以使用字符的16進制字符表達形式
bs2 = bytes('\x61\x62\x63',"utf-8")
# 直接對字符進行編碼成二進制形式
bs2 = "abc".encode()

# 16進制字符轉爲bytes類型
b1 = bytes.fromhex("61 62 63")  #  ==>   b"abc"   "61,62"是兩位16進制數組合,該值不能超過 7F ,否則無法對應ASCII表中字符
b1.hex()                 # ===>  '616263'   ASCII碼中abc字符對應的16進制數組成的字符串,上面函數的逆運算

# bytes 類型中單個元素可以看做是一個10進制數值類型
print( b1[0] )  # ==>  10進制數,97

數值轉化爲bytes類型
前面已經說過,bytes 對象可以看做是一組數值(0-256)類型(二進制)的字符串,所以可以根據數值創建bytes 對象

# 傳入數值類型可迭代對象
b1 = bytes(range(97,100))               #  ==> b' abc '
b2 = bytes( [97,98,99] )                   #  ==> b' abc '
b3 = bytes( [97] )                             #  ==> b' a '

# 直接傳入10進制數值對象而不是可迭代對象,將會生成對應數值字節的空bytes
b4 = bytes(3)         #  b'\x00\x00\x00'   三個空字符的 bytes 

# 通過數值轉化將8進制,16進制數字 生成bytes對象
b5 = bytes( [ int("61",16) ] )    #16進制  == > 10 進制 ==> bytes ==>b"a"
b6 = bytes( [ int("61", 8) ] )     # 8進制  == > 10 進制 ==> bytes  ==>b"1"

#  也可利用bytes 對象轉化爲 10 進制 數值
num = int.from_bytes(b"abc","big")         # "abc"對應的三個字節拼接在一起作爲一個二進制數,並計算爲10進制數輸出
num                    #    ===>   6382179

bytes 對象可以可以理解爲字節的 str 類型,序列一旦創建不可變,同時,字符串類型可以使用的方法,基本適用於bytes對象。
例如

m = bytes("abc","utf-8")
n = bytearray(" def ","utf-8")
bs = m + n             # bytes 類型的拼接,生成新的bytes對象
bs                          # ===> b"abcdef" 

m.append(100)              # ==> 通過 10進制數,添加 b" d ", 單個值使用整型數值進行傳入
m.extend(b"efg")           # ==> 擴展bytearray對象使用 bytes或bytearray類型的可迭代對象 

其他字符串方法類似於str ,可查看 str 類型使用方法

bytearray類型

bytearray 可以看作是一組數值(0-256)(二進制) 的 list 序列,意味着bytearray 中的單個元素是可變的

ba1 = bytearray(range(97,103))
ba1                                  #  bytearay對象,==>  bytearray(b"abcdef" )
ba1[0]                              #   ==>  97  (integer)
ba1[1 :2]                          #  切片 ==> bytearray(b'bcd')

# 賦值,可變bytearray
ba[ 4 ] = 122                    #  122整型對應字符"z",   ==> b"e" --> b"z"
ba                                    #   bytearray(b"abcdzf" )
ba1[1:4] = b"xyz"             #  切片賦值,替換ba1[1:4]的內容, 只有bytes 或bytearray 序列可賦值
ba1                                  #  bytearray(b'axyzef')

bytearay 對象類似於 一個字節 的 list 對象,所以可以使用list 的大部分方法,注意的是,list 對象是對字符層面的操作,bytes 和 bytearay 則需要操作的是字節層面的元素,或者整型(因爲0-255的整型值可以直接使用二進制形式存入內存的單個字節中,也屬於單個字節操作)

進制轉化

bytes對象生成時可以根據16進制字符串(無前綴)或者10進制 數值,可以使用以下方法轉換各個進制字符

# 內置函數
chr(97)      #    ==> "a"
ord("a")     #    ==> 97

#帶前綴 0x 
format(97,"#x")                                   # ==> '0x61'
format(97,"#o")                                   # 8進制字符
format(97,"#b")                                   # 2進制字符
#不帶前綴
format(97,"X")                                    # ==> int ==> hex_str
format(97,"o")                                    # ==> int ==> oct_str
format(97,"b")                                    # ==> int ==> bin_str

# 3.6+版本使用方法
# f'{255:X}' 和 f'{255:#X}'                   ===> " FF "  和 "0xFF"

# 無前綴
"%x"%10                                     # ==> 'a'
"%o"%10                                     # ==> '12'
# 帶前綴                               
"%#x"%10                                     # ==> '0xa'
"%#o"%10                                     # ==> '0o12'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章