python數據類型 ——bytes 和 bytearray

bytes和 bytearray

bytes:能夠看做是一組二進制數值(0-255) 的 str 序列
bytearray :能夠看做是一組二進制數值(0-255) 的 list 序列python

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-255)的字符串,因此能夠根據數值建立bytes 對象app

# 傳入數值類型可迭代對象
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對象。
例如 ide

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的整型值能夠直接使用二進制形式存入內存的單個字節中,也屬於單個字節操做)code

進制轉化

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

# 內置函數
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'
相關文章
相關標籤/搜索