延邊州建設(shè)局網(wǎng)站上海平臺(tái)推廣的公司
文章目錄
- int 與 bytes轉(zhuǎn)換
- int 轉(zhuǎn) bytes
- bytes 轉(zhuǎn) int
- str 與 bytes互轉(zhuǎn)
- 其他格式轉(zhuǎn)字節(jié)
- 格式說明
- 轉(zhuǎn)字節(jié)
- 字節(jié)轉(zhuǎn)其他
字節(jié)在存儲(chǔ)的時(shí)候根據(jù)存儲(chǔ)的格式不同,可能會(huì)有大端小端之分,如果是數(shù)字,還有有符號(hào)無符號(hào)的區(qū)分,所以在自己處理的時(shí)候可能會(huì)有一些麻煩。所以記錄一下轉(zhuǎn)換的方法,希望有同樣遇到的人可以對(duì)其提供一些幫助。
常見的數(shù)據(jù)類型:
數(shù)據(jù)類型 | 字節(jié)長(zhǎng)度 | 取值范圍 |
---|---|---|
int8 | 1 | -128 ~ 127 |
uint8 | 1 | 0 ~ 255 |
int16 | 2 | -32768 ~ 32767 |
uint16 | 2 | 0 ~ 65535 |
int32 | 4 | -2^31 ~ 2^31 -1 |
uint32 | 4 | 0 ~ 2^32 -1 |
int 與 bytes轉(zhuǎn)換
int與bytes轉(zhuǎn)換,在python3中還是比較簡(jiǎn)單的,int已經(jīng)自帶了方法,可以直接使用,不過需要事先確定:數(shù)據(jù)存儲(chǔ)方式是大端存儲(chǔ)還是小端存儲(chǔ),數(shù)據(jù)類型是什么。
int 轉(zhuǎn) bytes
例子:
# int 轉(zhuǎn) bytes
int.to_bytes(字節(jié)長(zhǎng)度, 大端/小端存儲(chǔ), 關(guān)鍵字參數(shù)有符號(hào)還是無符號(hào))
- 大端:big
- 小端:little# 例如:將數(shù)字128存儲(chǔ)為int16類型的字節(jié),在計(jì)算機(jī)里小端存儲(chǔ)
# 如果實(shí)際數(shù)字超出了存儲(chǔ)字節(jié)的長(zhǎng)度,將會(huì)報(bào)錯(cuò)
int(128).to_bytes(2, 'little', signed=True)# 結(jié)果:b'\x80\x00'
bytes 轉(zhuǎn) int
例子:
# bytes 轉(zhuǎn) int
int.from_bytes(字節(jié), 大端/小端存儲(chǔ), 關(guān)鍵字參數(shù)有符號(hào)還是無符號(hào))
- 大端:big
- 小端:little# 例如:將剛剛存入的結(jié)果轉(zhuǎn)回來
int.from_bytes(b'\x80\x00', 'little', signed=True)
# 如果你使用大端模式解析出來,你會(huì)發(fā)現(xiàn)一個(gè)完全不一樣的數(shù)字
# 如果是只有一個(gè)字節(jié)的數(shù)據(jù),大端小端也就無所謂了
str 與 bytes互轉(zhuǎn)
這個(gè)還是比較簡(jiǎn)單的。
例如:
# str 轉(zhuǎn) bytes
# 這個(gè)轉(zhuǎn)化只需要對(duì)str進(jìn)行編碼就好了,默認(rèn)使用 utf-8編碼
'章三'.encode()# bytes 轉(zhuǎn) str
# 相應(yīng)的,只需要對(duì)bytes數(shù)據(jù)進(jìn)行解碼,默認(rèn)使用 utf-8 編碼
b''.decode()
其他格式轉(zhuǎn)字節(jié)
其他格式轉(zhuǎn)字節(jié)的話,可以借助struct
庫來完成,這里簡(jiǎn)單介紹一下它的使用方式和一些參數(shù)。
在使用struct
庫進(jìn)行轉(zhuǎn)化的時(shí)候,需要一個(gè)格式字符串說明數(shù)據(jù)是什么類型的,什么存儲(chǔ)方式之類的信息,所以先介紹一下他的格式說明。
格式說明
格式設(shè)置字符如下:
第一個(gè)字符:存儲(chǔ)方式
符號(hào) | 說明 |
---|---|
@ | 本機(jī)存儲(chǔ)順序、存儲(chǔ)大小、存儲(chǔ)隊(duì)列 (默認(rèn)選項(xiàng)) |
= | 本機(jī)存儲(chǔ)順序,標(biāo)準(zhǔn)存儲(chǔ)大小、存儲(chǔ)隊(duì)列 |
< | 小端序、標(biāo)準(zhǔn)存儲(chǔ)大小、存儲(chǔ)隊(duì)列 |
> | 大端序、標(biāo)準(zhǔn)存儲(chǔ)大小、存儲(chǔ)隊(duì)列 |
! | 與 > 相同 |
其余字符表示參數(shù)的類型,必須完全匹配;這些可以在十進(jìn)制重復(fù)計(jì)數(shù)之前:
符號(hào) | 說明 |
---|---|
x | 填充字節(jié),不是數(shù)據(jù) |
c | 字符 |
b | byte類型,1字節(jié)整型 |
B | 無符號(hào)byte |
? | _Bool (需要 C99;如果不可用,則使用 char 代替) |
h | short類型 2字節(jié)整型 |
H | 無符號(hào)short |
i | int類型 4字節(jié)整型 |
I(大寫i) | 無符號(hào)int |
l(小寫L) | long類型 8字節(jié)整型 |
L | 無符號(hào)long |
f | float類型 (32為浮點(diǎn)類型) |
d | double類型 |
e | half-float (16位浮點(diǎn)類型) |
s | string類型,也可以理解成字節(jié)數(shù)組。需要在s前存在一個(gè)十進(jìn)制數(shù)字表示字符串的長(zhǎng)度 |
格式為:
存儲(chǔ)方式 + 類型
例如:
# 小端存儲(chǔ)的 uinit32類型
<I# 大端存儲(chǔ)的 float32 類型
>f# 小端存儲(chǔ)的 10個(gè)字節(jié)的字符串?dāng)?shù)據(jù)
<10s
轉(zhuǎn)字節(jié)
轉(zhuǎn)字節(jié)使用struct.pack()
方法
該方法可以接收多個(gè)參數(shù),分別是:
- 格式
- 變量1
- 變量2
- …
單個(gè)轉(zhuǎn)
例如:
# 還是將128轉(zhuǎn)化小端存儲(chǔ)的,為2個(gè)字節(jié)存儲(chǔ)的有符號(hào)數(shù)字類型
struct.pack('<h', 128)
# 因?yàn)槭?個(gè)字節(jié)有符號(hào)的數(shù)字,所以應(yīng)該選擇 short 類型 所以格式為 '<h'
# 結(jié)果為:b'\x80\x00'# 將128.0 轉(zhuǎn)化為小端存儲(chǔ)的float類型的字節(jié)
struct.pack('<f', 128.)
# 結(jié)果為: b'\x00\x00\x00C'
轉(zhuǎn)多個(gè)
例如:
# 第一個(gè)是無符號(hào)整數(shù) 128 ,然后后變有一個(gè)3個(gè)字節(jié)的字符串 '秀', 使用小端存儲(chǔ)
struct.pack('<I3s', 128, u'秀'.encode())
# 結(jié)果:b'\x80\x00\x00\x00\xe7\xa7\x80'
字節(jié)轉(zhuǎn)其他
字節(jié)轉(zhuǎn)化為其他類型,使用 struct.unpack()
方法,結(jié)果是一個(gè)元組
該方法可以接收2個(gè)參數(shù),分別是:
- 格式
- 字節(jié)
例如:
# 將第一個(gè)是無符號(hào)整數(shù) 128 ,然后后變有一個(gè)3個(gè)字節(jié)的字符串 '秀', 使用小端存儲(chǔ)的數(shù)據(jù)轉(zhuǎn)回來
struct.unpack('<I3s', b'\x80\x00\x00\x00\xe7\xa7\x80')
# 結(jié)果為:(128, b'\xe7\xa7\x80')# 將使用小端存儲(chǔ)的128.0的字節(jié)轉(zhuǎn)換回來
struct.unpack('<f', b'\x00\x00\x00C')
# 結(jié)果為: (128.0,)
希望可以幫到你!
曾經(jīng)滄海難為水,
除卻巫山不是云。
取次花叢懶回顧,
半緣修道半緣君。