是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进制。616的一次方+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,看你怎么使用