天天看點

python bytearray拼接_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-255)的字元串,是以可以根據數值建立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'