2019/09/18 03-bytes和bytearray及编码

在这里插入图片描述
是python3中引入的两个新类型
bytes字节序列,不可变
bytearray 字节数组,可变
都是在内存里开辟的连续空间
在这里插入图片描述
字符可以用编码来理解,字节指的是0和1 的组合,在内存中所有数据都是0和1组成的,计算认识的数据是无差别的,就是0和1(同样的1111这个数据,有的可以说整形,有的可以说是列表),要理解,就需要拿数据结构往上套,拿数据类型往上套,你说他是什么类型,才会变成你想要的数据类型。
1.在内存中其实都是2进制的,要理解这个数据,必须告诉是什么类型,否则这个数据就是没有意义的

字符串是字符组成的有序序列,字符可以使用编码来理解
(在内存中本来就是0和1 ,首先告诉你这些0和1是做什么类型来理解(比如可以按字节理解为是字符串的,光是字符串还不行,字符串还需要告诉是什么编码,但如果把内存的东西当作字节来理解就无所谓了,字节序列,就是一个个字节的序列))
每个字节都是一个单元,一个个字节组成的连续的区域就是bytes,一个字符串在内存中是连续的(abc字符串,在内存中都是01,用字符串来理解就是abc,如果用字节来理解就是三个字节拼接在一起,字节的序列了;按字符串理解就是,字符序列)

byterarray,也是字节的序列,不过就是可变的
在这里插入图片描述在这里插入图片描述
强制解码成字符串
在这里插入图片描述
现在看到的abc是utf-8编码的字符串
在这里插入图片描述
61 62 63 是在内存放到,可以理解为字节
早些年打游戏,有内存修改工具,可以挂着,遍历内存中的东西,然后去分析数据,需要经过动态分析,在内存中的0和1是没有什么差别的,就看你怎么理解了,是当字符串,还是整数,还是当数据的一部分
在这里插入图片描述
bytes是不可变的,bytearray可变的在这里插入图片描述在这里插入图片描述
ascii是美国信息交换标准代码,是定义一个字节,一个字节等于8位,能够表示正整数的范围是0-255,总共256种变化,
对我们来讲只使用一半,最高位没有用相当于一半没用,用的只有0-127,内存的数据,是ascii码,ascii码对应谁,就需要建一张表

9比较常用就是个tab键
在这里插入图片描述
换行10 0a
在这里插入图片描述
回车13 0d
在这里插入图片描述在这里插入图片描述在这里插入图片描述
就需要按照ascii编码表,找到对应的是什么意思在这里插入图片描述
一个个字节无非是0和1的组合而已,作为bytes是没有什么特别的意义的,但如果需要把一个个bytes变成string,如果说string是ascii编码格式的,按照ascii码的一个个来

8位全满就是255,从0开始到255,一个256种状态
在这里插入图片描述
最高位没用可以理解位0
128对应16进制,80,128/16= 商数8余数 0
2进制转换16进制,乘以8421
18+04+02+01=80

在这里插入图片描述
10的0次方是1在这里插入图片描述
内存打开就是一个个字节在这里插入图片描述
python可以把这些认为是bytes,如果告诉你asciii编码的,就需要查表了在这里插入图片描述在这里插入图片描述
61,16进制,对应97
在这里插入图片描述
utf-8用到了ascii的标准,另外的128种变化,称为扩展的ascii码,但是后面的样式有很多,各不相同,前面的128字符是都遵守的

用python打印abc实际上就是把内存种的字符串查这张编码表,打印出来,必须拿值去找,不论10进制还是16进制对计算机来讲都是2进制,用2进制就在编码表了找到了61 对应的就是97,找到字符a,但是还是打不出来,需要告诉这个是什么字体,还需要到这个字符文件找,找这个字体是什么样的点阵,然后再屏幕上用像素点给你打印出来
(61,62,63是16进制的)
我们可以就理解,如果这个字节告诉你是ascii码,就把字节拿到ascii码这边来查表,找到所对应的字符,然后只要print,就找到字符文件,是什么点阵打印出多少像素

在这里插入图片描述在这里插入图片描述
总结:一个内存中的字节其实是无差别的,拿字符串类型一套,就有差别的,类型,字符串在一个字节里有不同的定义方式,0-127个字节里,只需要做一件事情,查表,最后做一些字符转换,用print给我们打印出来,在内存中看到的数据都是0和1的组合

常用的ascii码需要记住一写,比如空格
在这里插入图片描述
0是48
在这里插入图片描述在这里插入图片描述
0的16进制就是30
二进制是48 换算,48/16=3,补0,=30
用短除法。用16作除数,去除需要转换的十进制数,记下商和余数,再用16作除数,去除上一步的商,记下商和余数,……,直到商为零。
把每一步得到的余数逆序排列,就是转换成的16进制。

在这里插入图片描述
没有什么文件是用记事本打不开的,因为所有字节都可以用ascii码来理解,
能打开说明一切数据都可以作为文本来理解,无非是你是当数字理解还是字符串理解,一切字节都可以当文本,内存中的所有数据都可以当文本理解,一个个字节都可以当字符串来理解

在这里插入图片描述
左边其实是还不能当是在内存的结构,只能看到一点内存的影子
内存中存的数据本质上就是0和1,你要理解就需要赋予一种数据类型,如果把他们当作字符串理解就是字符串了,如过当字符串就不是一个个字节,是一个个字符
在计算机都是放16进制的,不会直接放abc,abc是给人看的,
在这里插入图片描述
ascii码是从0-127
30,40,60附近就是你想要的
30 是0
41是A
61是a
在这里插入图片描述
如果在内存中16进制显示
61,16进制,转成10进制就是97,如果当字符串理解且是ascii编码,就是a
ascii码的a可以转换成其他的,
ascii码可以转换成bytes ,0和1 ,然后拿整形来理解,就可以变成其他的
一个数字要映射到字符上的时候,最快的方式就是查表
在这里插入图片描述
所有文件就是一个字节序列,所有文件都可以用文本编辑器来打开,经常这么做,可以看个文件头在这里插入图片描述
字节序列的定义
bytes不可变,定义位空就没有用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可迭代int数组在这里插入图片描述
range是可以迭代的
在这里插入图片描述
\n是换行符对应16进制10,16进制的10 =a
0a=10
回车换行是0b0a
0b=13
bytes在表示的时候前面会有个前缀b

在这里插入图片描述
一个是定义有几个,后面是定义有几个元素组成的bytes
一个定义长度,一个定义内容
在这里插入图片描述
输出的是整形的可迭代对象
在这里插入图片描述
需要输入的是整形可迭代对象,这样就出问题了
在这里插入图片描述
buffer是缓冲,实际上指的是字节缓冲,就是字节序列
在这里插入图片描述
跟list后面加可迭代对象一样,只不过要求里面的元素也是bytes,一个个字节
造字节序列还得用字节,里面必须是字节,里面重新造一份出来,类似copy

在这里插入图片描述
b代表是bytes
在这里插入图片描述
还有一种方式
在这里插入图片描述
直接给会提示你,需要使用编码方式
在这里插入图片描述
**这样就把abc,转换成字节的abc
已经转换成16进制,可以理解为bytes组成的0x610x620x63,python怕我们看不习惯,直接用字符的友好形式展示给你
**
在这里插入图片描述
encode默认是utf-8编码,从abcd字符串转换成了bytes序列,只不过python用一种友好的方式向你展示
在这里插入图片描述
如果不能用abcd这样直接展示,就用16进制给你展示在这里插入图片描述
bytes一旦定义好,就不允许修改在这里插入图片描述
更常用这种方式定义bytes,abc9都是简单的ascii码里面能够直接表达的东西
使用16进制表示b"\X41\X61",16进制的字符表达方式是\x,在表示16进制整数的时候是0x表示

在这里插入图片描述
41是A,61是a
在这里插入图片描述
bytes类似string,bytes面向的是字节,string面向的是字符,操作类似,替换字节,还是替换字符,bytes本身不可变的,返回一个新的字节
在这里插入图片描述
把f字节替换成k字节
在这里插入图片描述
把abc中找到b这个字节,不要把前缀b忘了,否则抛出异常
在这里插入图片描述
bytes的另外的构造方式在这里插入图片描述
2位字符来表示一个字节的
可以用16进制来表转换成一个bytes

在这里插入图片描述
16进制的字符串
在这里插入图片描述
utf-8返回bytes的类型,hex取16进制表达
在这里插入图片描述
bytes是字节的序列
99本来是c,但是这里当整形,当数字理解
在这里插入图片描述在这里插入图片描述
byterarry是可变类型

这里的0是ascii0不是字符0
在这里插入图片描述
在这里插入图片描述
把一个字符串转换成了可变的byte array
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
为了保证跟bytes一致,replace方法都是返回一个新的byterarray
find返回-1或者正索引值

在这里插入图片描述
abc.encode转换的bytes类型,bytearray包一下就变成了bytearray
在这里插入图片描述
bytearray是一个可变的序列,单个字节可以当int来理解
在这里插入图片描述在这里插入图片描述在这里插入图片描述
不能直接写61,直接写表达的是10进制的在这里插入图片描述
在这里插入图片描述
97的转换十6进制,97/16=61 换成字符就是a在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
16进制转换,几次方 看 这个数在第几个位置,从0次方开始,从右往左
321 就是 3 * 16 2次方 + 2 * 16 1次方 + 1 * 16 0次方

在这里插入图片描述在这里插入图片描述在这里插入图片描述
找到值移除,又需要遍历了在这里插入图片描述
reverse是就地反转,是比较耗时的在这里插入图片描述
34转换成16进制,34/16=22,商数是2,余数是2
22转换成10进制,22=216的一次方+216的0次方=32+21=34
100转换成16进制,100/16=64,商数6余数是4
64转换成10进制。6
16的一次方+416的0次方=96+41=100
56转换成16进制,56/16=38,商数是3,余数是8
38转换成10进制,316的一次方+81=48+8=56
在这里插入图片描述在这里插入图片描述
b’abc’是字节不是字符串,再内存存放就是0x616263
一个整形再内存中不过是一些字节组成,从一个字节序列拿到一个整型值

在这里插入图片描述
把这个字节打印一下,16进制是什么,所以内存中存放的都是一些无差别字节,认为是整型就是整型,认为是字符串就是字符串,按照字符串理解就是0x616263 ,按照整形就是6382179
内存的数据就是0和1,就看你想怎么理解了

在这里插入图片描述
拿到整型也可以转成bytes
在这里插入图片描述
\x61\x62\x63=abc
在这里插入图片描述
可以转成bytes
在这里插入图片描述
**这个是一个bytes,不是字符的abc
这两个是类型不一样,
**
在这里插入图片描述
abc编码会返回一个bytes
在这里插入图片描述
**从abc通过编码得到bytes,由bytes得到整型,tobytes又得到一个bytes
内存中就一份数据看你想做整型理解还是字符串理解
big是大端模式,还有小端
大端小端是指再内存中是怎么放的
如果ab占两个字节,a应该放高地址还是低地址
(macos大端模式,windows小端模式,高低相反,形成大小端,如果取的数据不对,就取错了,
网络传输用大端模式,big,低字节放到高地址上就是大端模式,低字节放到低地趾上就是小端模式)
**
别人问你知道大小端,你回答就是高低字节的排放顺序,记得网络是大端模式,windows是小端模式,
在这里插入图片描述
在这里插入图片描述
有个概念很重要
在这里插入图片描述
ipython的变量,_下划线,指代上一次的输出out
上次的byte,decode把它给解码
bytes到string

在这里插入图片描述
数据在计算展现都是0和1,看你怎么使用
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值