日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python中int、str、bytes相互转化,还有2进制、16进制表示,你想要的都在这里了

發(fā)布時間:2024/3/7 python 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python中int、str、bytes相互转化,还有2进制、16进制表示,你想要的都在这里了 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • 數(shù)據(jù)類型轉(zhuǎn)化
    • int -> str
      • 使用 str() 函數(shù)
      • 使用 format() 函數(shù)
      • 使用 hex() 轉(zhuǎn)換成16進制形式
      • 使用 bin() 轉(zhuǎn)換成2進制形式
    • str -> int
      • 使用 int() 進行各進制數(shù)字轉(zhuǎn)換
    • 什么是bytes
    • int -> bytes
      • 使用 to_bytes() 轉(zhuǎn)換成定長bytes
      • 使用 bytes() 函數(shù)把int數(shù)組轉(zhuǎn)成bytes
      • 使用 struct.pack() 函數(shù)把數(shù)字轉(zhuǎn)化成bytes
    • bytes -> int
      • 使用 from_bytes() 把 bytes 轉(zhuǎn)化成int
      • 使用 struct.unpack() 把 bytes 轉(zhuǎn)化成int
    • str 和 bytes
      • 使用 encode() 函數(shù)完成 str -> bytes
      • 使用 decode() 函數(shù)完成 bytes -> str
    • 假如使用了 str() 函數(shù)
  • 轉(zhuǎn)化表格
  • 總結(jié)

前言

數(shù)據(jù)類型轉(zhuǎn)換是個很基礎(chǔ)的操作,很多語言中都要做這些轉(zhuǎn)換,例如前一段時間剛剛總結(jié)了《C/C++中string和int相互轉(zhuǎn)換的常用方法》,python 自從分離出 python3 版本之后,str 和 bytes 兩個類型弄蒙了一大票人,在這兩種類型的轉(zhuǎn)換上我可是花了不少時間,記住一點,別隨隨便便使用 str() 函數(shù),很多數(shù)據(jù)使用 str() 變成字符串之后再想恢復(fù)可就難了。

本文所有示例均在 Python 3.7.5 上測試,Python2 已經(jīng)被我拋棄了,我來試著把常見的轉(zhuǎn)換都放到一起,把踩過的坑拿來開心一下,如果有些常用的類型轉(zhuǎn)換這里沒有的話,也歡迎小伙伴們提出來,我將持續(xù)補充,好了,可以開始了。

數(shù)據(jù)類型轉(zhuǎn)化

數(shù)字中除了整數(shù),還有浮點數(shù)、復(fù)數(shù)等,但是 int 是最常見的類型,所有轉(zhuǎn)換中的數(shù)字只涉及 int 數(shù)字類型。

int -> str

使用 str() 函數(shù)

num = 10 val = str(10) print(type(val), val)#<class 'str'> 10

使用 format() 函數(shù)

num = 10 val = '{0}'.format(num) print(type(val), val)#<class 'str'> 10

使用 hex() 轉(zhuǎn)換成16進制形式

num = 10 val = hex(num) print(type(val), val)#<class 'str'> 0xa

使用 bin() 轉(zhuǎn)換成2進制形式

num = 10 val = bin(num).replace('0b','') print(type(val), val)#<class 'str'> 1010

str -> int

這個轉(zhuǎn)換比較專一,只使用 int() 函數(shù)就可以了,這個函數(shù)實際上有兩個參數(shù),第二個參數(shù)表示進制,默認是10進制,你可以改成2進制或者16進制,甚至是3進制、5進制等等

使用 int() 進行各進制數(shù)字轉(zhuǎn)換

val = int('10') print(type(val), val)val = int('0xa', 16) print(type(val), val) val = int('a', 16) print(type(val), val)val = int('0b1010', 2) print(type(val), val) val = int('1010', 2) print(type(val), val)val = int('101', 3) print(type(val), val)val = int('60', 5) print(type(val), val)# 結(jié)果均為 <class 'int'> 10

使用 int() 函數(shù)的時候要主要注意一點,如果提供的字符串不能轉(zhuǎn)換成指定進制的數(shù)字,那么會報異常,就像下面這樣,所以在使用這個函數(shù)的時候最好放到 try 語句中。

val = int('128', 2)''' Traceback (most recent call last):File "D:\python\convert\convert.py", line 41, in <module>val = int('128', 2) ValueError: invalid literal for int() with base 2: '128' [Finished in 0.1s with exit code 1] '''

什么是bytes

在列舉 bytes 相關(guān)的轉(zhuǎn)化前,我們來先認識一下這個類型,在 Python3 中 int、str、bytes 類型的變量實際上都是一個 “類” 的對象,而 bytes 相比 str 而言更接近底層數(shù)據(jù),也更接近存儲的形式,它其實是一個字節(jié)的數(shù)組,類似于 C 語言中的 char [],每個字節(jié)是一個范圍在 0-255 的數(shù)字。

bytes 其實就是這樣一連串的數(shù)字,計算機世界所有的信息都可以用這樣一串?dāng)?shù)字表示,一幅畫,一首歌,一部電影等等,如果對編碼感興趣可以看看這篇《簡單聊聊01世界中編碼和解碼這對磨人的小妖兒》,現(xiàn)在清楚bytes是什么了,我們可以看看和它相關(guān)的轉(zhuǎn)化了。

int -> bytes

使用 to_bytes() 轉(zhuǎn)換成定長bytes

num = 4665 val = num.to_bytes(length=4, byteorder='little', signed=False) print(type(val), val)#<class 'bytes'> b'9\x12\x00\x00'

這段代碼就是把數(shù)字 4665 轉(zhuǎn)化成定長的4個字節(jié),字節(jié)序為小端,我們來簡單看一下是怎么轉(zhuǎn)換的:

上面我們提到 bytes 類型一串 0-255 范圍的數(shù)字,4665 肯定超出了這個范圍,可以先轉(zhuǎn)化成256進制,就變成了 <18><57>,也就是 4665 = 18 * 256 + 57,我們發(fā)現(xiàn)兩個字節(jié)就能存儲這個數(shù)字,一個18,一個57,要想組成4個字節(jié)的數(shù)組需要補充兩個空位,也就是補充兩個0,這時就涉及到一個排列順序,是 [0,0,18,57] 還是 [57, 18, 0, 0] 呢,這就是函數(shù)參數(shù)中的字節(jié)序 byteorder,little 表示小端,big 表示大端,這里選擇的小端 [57, 18, 0, 0] 的排列。

看到這里可能會迷糊,好像和結(jié)果不一樣啊,其實這只是一個表示問題,57 的 ASCII 碼對應(yīng)這個字符 ‘9’,18 表示成16進制就是 ‘0x12’,這里寫成 b’9\x12\x00\x00’ 只是便于識別而已,實際上內(nèi)存存儲的就是 [57, 18, 0, 0] 這一串?dāng)?shù)字對應(yīng)的二進制編碼 ‘00111001 00010010 00000000 00000000’。

使用 bytes() 函數(shù)把int數(shù)組轉(zhuǎn)成bytes

參考上面的生成的數(shù)組,可以通過數(shù)組生成相同的結(jié)果

num_array = [57, 18, 0, 0] val = bytes(num_array) print(type(val), val)#<class 'bytes'> b'9\x12\x00\x00'

使用 struct.pack() 函數(shù)把數(shù)字轉(zhuǎn)化成bytes

num = 4665 val = struct.pack("<I", num) print(type(val), val)#<class 'bytes'> b'9\x12\x00\x00'

這里的 "<I" 表示將一個整數(shù)轉(zhuǎn)化成小端字節(jié)序的4字節(jié)數(shù)組,其他的類型還有:

參數(shù)含義
>大端序
<小端序
Buint8類型
bint8類型
Huint16類型
hint16類型
Iuint32類型
iint32類型
Luint64類型
lint64類型
sascii碼,s前帶數(shù)字表示個數(shù)

bytes -> int

明白了上面的轉(zhuǎn)化過程,從 bytes 轉(zhuǎn)化到 int 只需要反著來就行了

使用 from_bytes() 把 bytes 轉(zhuǎn)化成int

bys = b'9\x12\x00\x00' val = int.from_bytes(bys, byteorder='little', signed=False) print(type(val), val)#<class 'int'> 4665

使用 struct.unpack() 把 bytes 轉(zhuǎn)化成int

bys = b'9\x12\x00\x00' val = struct.unpack("<I", bys) print(type(val), val)#<class 'tuple'> (4665,)

str 和 bytes

前面的這些轉(zhuǎn)化還算清晰,到了字符串str 和字節(jié)串 bytes,就開始進入了混沌的狀態(tài),這里會出現(xiàn)各種編碼,各種亂碼,各種報錯,牢記一點 str 到 bytes 是編碼過程,需要使用 encode() 函數(shù), bytes 到 str 是解碼過程,需要使用 decode() 函數(shù),請勿使用 str 函數(shù),否則后果自負。

使用 encode() 函數(shù)完成 str -> bytes

s = '大漠孤煙直qaq' val = s.encode('utf-8') print(type(val), val)# <class 'bytes'> b'\xe5\xa4\xa7\xe6\xbc\xa0\xe5\xad\xa4\xe7\x83\x9f\xe7\x9b\xb4qaq'

使用 decode() 函數(shù)完成 bytes -> str

bys = b'\xe5\xa4\xa7\xe6\xbc\xa0\xe5\xad\xa4\xe7\x83\x9f\xe7\x9b\xb4qaq' val = bys.decode('utf-8') print(type(val), val)# <class 'str'> 大漠孤煙直qaq

假如使用了 str() 函數(shù)

從上面來看字符串和字節(jié)串的轉(zhuǎn)化蠻簡單的,甚至比整數(shù)的轉(zhuǎn)化都要簡單,但是你如果把一個 bytes 變量用 str() 轉(zhuǎn)化成字符串,你就得手動來處理了,這個函數(shù)寫過n次了,暫時還沒找到好的處理辦法。

bys = b'\xe5\xa4\xa7\xe6\xbc\xa0\xe5\xad\xa4\xe7\x83\x9f\xe7\x9b\xb4qaq' s = str(bys) print(type(s), s) #<class 'str'> b'\xe5\xa4\xa7\xe6\xbc\xa0\xe5\xad\xa4\xe7\x83\x9f\xe7\x9b\xb4qaq'def str2bytes(str_content):result_list = [];pos = 0str_content = str_content.replace("\\n", "\n").replace("\\t", "\t").replace("\\r", "\r")content_len = len(str_content)while pos < content_len:if str_content[pos] == '\\' and pos + 3 < content_len and str_content[pos + 1] == 'x':sub_str = str_content[pos + 2: pos + 4]result_list.append(int(sub_str, 16))pos = pos + 4else:result_list.append(ord(str_content[pos]))pos = pos + 1return bytes(result_list)val = str2bytes(s[2:-1]) print(type(val), val)# <class 'bytes'> b'\xe5\xa4\xa7\xe6\xbc\xa0\xe5\xad\xa4\xe7\x83\x9f\xe7\x9b\xb4qaq'

什么時候會遇到這種情況,就是有些數(shù)據(jù)是以 bytes 的形式給的,但是經(jīng)過中間人復(fù)制轉(zhuǎn)發(fā)變成了字節(jié)流形式的字符串,格式還不統(tǒng)一,有些已經(jīng)翻譯成了字符,有些還保留了0x或者\x形式,這時就要手工處理了。

轉(zhuǎn)化表格

上面的轉(zhuǎn)化方式和解釋穿插在一起有些亂,這里總結(jié)一個表格,便于今后拿來就用

源類型目標(biāo)類型方式結(jié)果
intstrstr(10)、'{0}'.format(10)10 => '10'
intstr(16進制)hex(10)10 => '0xa'
intstr(2進制)bin(10).replace('0b','')10 => '1010'
strintint('10')'10' => 10
str(16進制)intint('0xa', 16)'0xa' => 10
str(2進制)intint('1010', 2)'1010' => 10
intbytesnum.to_bytes(length=4, byteorder='little', signed=False)4665 => b'9\x12\x00\x00'
intbytesstruct.pack("<I", 4665)4665 => b'9\x12\x00\x00'
bytesintint.from_bytes(b'9\x12\x00\x00', byteorder='little', signed=False)b'9\x12\x00\x00' => 4665
bytesintstruct.unpack("<I", b'9\x12\x00\x00')b'9\x12\x00\x00' => 4665
int[]bytesbytes([57, 18, 0, 0])[57, 18, 0, 0] => b'9\x12\x00\x00'
bytesint[][x for x in b'9\x12\x00\x00']b'9\x12\x00\x00' => [57, 18, 0, 0]
strbytes'美好'.encode('utf-8')'美好' => b'\xe7\xbe\x8e\xe5\xa5\xbd'
strbytesbytes('美好', 'utf-8')'美好' => b'\xe7\xbe\x8e\xe5\xa5\xbd'
bytesstrb'\xe7\xbe\x8e\xe5\xa5\xbd'.decode('utf-8')b'\xe7\xbe\x8e\xe5\xa5\xbd' => '美好'
bytesbytes(無\x)binascii.b2a_hex(b'\xe7\xbe\x8eqaq')b'\xe7\xbe\x8eqaq' => b'e7be8e716171'
bytesbytes(有\(zhòng)x)binascii.a2b_hex(b'e7be8e716171')b'e7be8e716171' => b'\xe7\xbe\x8eqaq'
bytesstr(hex)b'\xe7\xbe\x8eqaq'.hex()b'\xe7\xbe\x8eqaq' => 'e7be8e716171'
str(hex)bytesbytes.fromhex('e7be8e716171')'e7be8e716171' => b'\xe7\xbe\x8eqaq'

總結(jié)

  • Python3 對字符串和二進制數(shù)據(jù)流做了明確的區(qū)分,不會以任意隱式的方式混用 str 和 bytes
  • bytes 類型是一種比特流,它的存在形式是 01010001110 的形式,需要解碼成字符才容易被人理解
  • struct 模塊中的 pack() 和 unpack() 可以實現(xiàn)任意類型和 bytes 之間的轉(zhuǎn)換
  • binascii.b2a_hex 和 binascii.a2b_hex 可以實現(xiàn)16進制 bytes 的不同形式轉(zhuǎn)換,不過轉(zhuǎn)換前后長度發(fā)生了變化

==>> 反爬鏈接,請勿點擊,原地爆炸,概不負責(zé)!<<==

初識不知曲中意,再聞已是曲中人

總結(jié)

以上是生活随笔為你收集整理的Python中int、str、bytes相互转化,还有2进制、16进制表示,你想要的都在这里了的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩亚洲欧美一区二区 | 秋霞网一区二区三区 | 欧美精品一区在线观看 | 精品视频一二三区 | 国产精品久久av无码一区二区 | 欧美无砖砖区免费 | 99热这里只有精品3 成年人黄色网址 | 黄色a一级片 | 日本不卡视频一区 | 日韩av在线播 | 综合久久av | 欧洲一二三区 | 中国精品视频 | 亚洲伊人久久综合 | 中文字幕免费观看视频 | 亚洲成人黄色在线 | 男人的天堂av网 | 免费av网站大全 | 狗爬女子的视频 | 成人亚洲精品久久久久软件 | 午夜免费成人 | 日本三级免费网站 | 玩弄白嫩少妇xxxxx性 | 成人精品一区二区 | 少妇性高潮视频 | 日韩精品人妻无码一本 | 在线色资源| 毛片2 | 久久久九九九九 | 黄色激情在线观看 | 欧美黑丝少妇 | 在线播放日韩av | 欧美性受xxxx黑人xyx性 | 久久综合免费 | 国产人成视频在线观看 | 久热精品视频在线播放 | 免费精品一区二区 | 欧美精品videos另类 | 久草视频在线播放 | 久久精品69 | 久91| 欧美日韩精品在线视频 | 九月色婷婷 | 亚洲午夜久久久久久久久红桃 | 国产一级片在线 | 99中文字幕在线观看 | 老司机久久 | 国产精品乱码久久久久久久久 | 中文字幕99页| 36d大奶| 综合九九 | 台湾综合色 | 亚洲国产精品电影 | 玉势 (1v1 高h)| 久久综合狠狠 | 国产成人精品视频 | 中文字幕第4页 | 久久精品5 | 国产无遮挡又黄又爽在线观看 | 尹人综合在线 | 男男av网站 | 久久久久亚洲av片无码 | 亚洲日本香蕉 | 香蕉久久久久久久av网站 | 五月婷婷啪啪 | 免费激情网站 | 山外人精品影院 | 黄瓜视频在线播放 | 日本综合视频 | 欧美日韩久久精品 | 91粉色视频| 打开免费观看视频在线播放 | 欧美12--15处交性娇小 | 日韩中文字幕精品视频 | 国产伦精品一区二区三区免.费 | 国语对白做受69按摩 | 日本老妇高潮乱hd | 北条麻纪在线观看aⅴ | 雷电将军和丘丘人繁衍后代视频 | 天堂av资源在线观看 | 欧美一级做a爰片久久高潮 久热国产精品视频 | 成人午夜一区 | 国产又黄又大又粗的视频 | 日韩免费黄色片 | 三级4级全黄60分钟 成人自拍视频 | 日韩在线视频在线 | 国产91精选 | 美女网站全黄 | 最新网址av | 尤物久久| 亚洲精品成人无码毛片 | 国产九九九九 | 熟妇人妻中文字幕无码老熟妇 | 电车痴汉在线观看 | 日韩精品一区二区在线看 | 中出 在线 | 啄木乌欧美一区二区三区 | 1000部啪啪未满十八勿入 | 成人午夜看片 |