python byte类型与int、str类型转换

bytes类型解释

python中的bytes类型可以类比为C中的uint8型数组,本质就是顺序排列的8bit二进制数字,例如以二进制方式从文件中读取时返回的就是bytes类型,或以b前缀的字符串也是bytes类型,如

 a = b'abcd'
print(type(a))

返回<class 'bytes'>

bytes类型与ascii码、str类型区别

bytes类型非常容易和ascii码以及str类型混淆,我也中间被绕晕几次,现在整理如下

  • bytes类型和ascii码
import sys

b = b'\x61\x62\x63\x64'  #代表两个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等

  • bytes类型与str类型

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类型的解析

bytes类型的解析可以分为两类,一类是解析为数字类型,一类是解析为文本

bytes解析为数字

主要分为解析为 UINT8、UINT16、UINT32、UINT64等数字类型,即分别对应将每1、2、4、8个字节放一起解释为一个数字,这其中对于多于一个字节的情况又分大小端处理
推荐使用自带的struct库解析,方法比较通用

  • 用法
    strcut.unpack(fmt, byte)
    其中fmt为格式化字符串,分为两部分,开头控制大小端,后面通过字符控制数字类型,常用如下
fmt 含义
i 大端序,和>相同
> 大端序
< 小端序
B uint8类型
b int8类型
H uint16类型
h int16类型
I uint32类型
i int32类型
L uint64类型
l int64类型
s ascii码,s前带数字表示个数

更多详细fmt的用法可用help(strcut)

  • 例子
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

bytes解析为文本

文本最终是属于某一种字符集的,ascii码是一种最常见的字符集,而为了表示汉字等还有utf-8以及unicode等字符集,从bytes解析到文本常用两种方法

  • decode方法(通用)

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流中可能包含不止一种字符集的数字,此时解析就会有问题,如解析报文流的时候

  • struct方法(解析ascii)
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类型

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容