python byte型別與int str型別轉換

2021-09-24 12:34:54 字數 2418 閱讀 8747

python中的bytes型別可以模擬為c中的uint8型陣列,本質就是順序排列的8bit二進位制數字,例如以二進位制方式從檔案中讀取時返回的就是bytes型別,或以b字首的字串也是bytes型別,如

a = b'abcd'

print(type(a))

返回

bytes型別非常容易和ascii碼以及str型別混淆,我也中間被繞暈幾次,現在整理如下

import sys

a = b'\x61\x62\x63\x64' #代表4個beyte的16進製制數字,分別是0x61 0x62 0x63 0x64 即97~100

b = b'abcd' #代表abcd的ascii碼對應的4個1byte數字,分別是97、98、99、100

for i in b:

print(b) # 97 98 99 100

print(a==b) #true

bytes只是乙個8bit數字為乙個單位元素的陣列,而ascii是解析這樣乙個數字陣列的解碼方式,類似的還有utf-8等

b = b'abcd'

print(b[0]) #97

print(int(b[0]) #97

s = 'abcd' #並不代表記憶體中是按abcd的ascii碼儲存的!str實際是乙個物件而不是乙個簡單陣列

print(int(s[0])) #error 因為str型別的每個元素不是乙個簡單數字!

str是乙個物件型別,不是c中的字串概念,無法直接強轉為數字

bytes型別就是最基本的"code",即連續的二進位制數字,而對bytes型別做不同的」解釋「, 按照ascii碼解析得到了str,按照utf-8解析,可以得到更多字元表示

bytes型別的解析可以分為兩類,一類是解析為數字型別,一類是解析為文字

主要分為解析為 uint8、uint16、uint32、uint64等數字型別,即分別對應將每1、2、4、8個位元組放一起解釋為乙個數字,這其中對於多於乙個位元組的情況又分大小端處理,推薦使用自帶的struct庫解析,方法比較通用

strcut.unpack(fmt, byte)

其中fmt為格式化字串,分為兩部分,開頭控制大小端,後面通過字元控制数字體別,常用如下更多詳細fmt的用法可用help(strcut)

fmt含義!

大端序,和》相同

>

大端序<

小端序b

uint8型別

bint8型別

huint16型別

hint16型別

iuint32型別

iint32型別

luint64型別

lint64型別

sascii碼,s前帶數字表示個數

import struct

m = b'\x01\x01\x02\x01\x02\x03\x04' #7個位元組

a=struct.unpack('!bhi', m)

for i in a:

print(hex(i)) # 0x1 0x102 0x1020304

文字最終是屬於某一種字符集的,ascii碼是一種最常見的字符集,而為了表示漢字等還有utf-8以及unicode等字符集,從bytes解析到文字常用兩種方法

b = b'\x61\x62'

b2=b'\xe4\xbd\xa0\xe5\xa5\xbd'

print(b.decode('ascii')) #a b

print(b2.decode('utf-8')) #你好

errb = b'\x80\x61'

print(errb.decode('ascii')) #error! 0x80不是ascii字符集的元素!

bytes型別自帶的decode方法即可,入參指定解析字符集,但有的時候bytes流中可能包含不止一種字符集的數字,此時解析就會有問題,如解析報文流的時候

import struct

b= b'\x80\x61'

m=struct.unpack('!b1s', b)

for i in m:

print(m) # 0x80, b'a'

print(m[1].decode())

通過s前指定數字來限定解析為ascii的byte範圍,這樣就對bytes中混合代表數字和代表ascii的位元組做分別解析了

注意,strcut的s解析出認為bytes型別,需要進一步decode解析為str型別

Python Byte型別(API系列)

原文 python3新增的byte型別 博主 傑瓊王子 總結 abcle 在python2中位元組型別同字元型別區分不大,但是在python3中最重要的特性是對文字和二進位制資料做了更加清晰的區分,文字總是unicode,由字元型別表示,而二進位制資料則由byte型別表示,python3不會以任意隱...

靜態型別與動態型別

為了支援c 的多型性,才用了動態繫結和靜態繫結。理解他們的區別有助於更好的理解多型性,以及在程式設計的過程中避免犯錯誤,需要理解四個名詞 1 物件的靜態型別 物件在宣告時採用的型別。是在編譯期確定的。2 物件的動態型別 目前所指物件的型別。是在執行期決定的。物件的動態型別可以更改,但是靜態型別無法更...

值型別與引用型別

直白點兒說 值型別就是現金,要用直接用 引用型別是存摺,要用還得先去銀行取現。麥機長 我覺得這話十分形象。宣告乙個值型別變數,編譯器會在棧上分配乙個空間,這個空間對應著該值型別變數,空間裡儲存的就是該變數的值。引用型別的例項分配在堆上,新建乙個引用型別例項,得到的變數值對應的是該例項的記憶體分配位址...