本节我们开始讲python数据类型之bytes类型,我们分为上下两个章节。

你可以直接到这个页面观看本节视频:免费视频教程!零基础学Python系列(7) - 数据类型之bytes(上)

以下为对应的课件内容:


Bytes是python3新增的一个数据类型,用于表示一个字节串,它是一个有序的序列。

通常有两种方式来构造一个bytes类型的对象:

1、通过bytes()函数构造

bytes_1 = bytes('hello', 'utf-8')
bytes_2 = bytes([1, 200, 80, 50])

2、通过b后面跟字符串的方式

bytes_3 = b'world'
bytes_4 = b'\x77\x6f\x72\x6c\x64'

我们在print一个bytes类型数据时,python会以/x的格式依次打印每个字节的值,以两位16进制来显示。但是python对于一些字符会直接字符编码转换,所以造成打印出来的结果看起来很混乱,比如:

​​​​​​​bytes_2 = bytes([1, 200, 80, 50])print('bytes_2:', bytes_2)

输出结果为:

bytes_2: b'\x01\xc8P2'

最后两个数值80、50,被转换为了字符P、2,看起来很混乱。

这时,我们可以写一个简单的方法,让它不做这种转换:

# bytes 按照16进制输出,强制不ascii转码
def trans(s):return "b'%s'" % ''.join('\\x%.2x' % x for x in s)bytes_2 = bytes([1, 200, 80, 50])print('bytes_2:', trans(bytes_2))

输出结果为:

bytes_2: b'\x01\xc8\x50\x32'

这样我们看到,bytes里面包含了一个一个的字节。

因为我们还没有学函数的概念,所以大家只要知道在输出的时候调用这个方法即可。

bytes类型,存储的是一系列的字节,它并不关注这些字节具体表示什么含义(字符、网络数据、图片、音视频等)。Bytes并不约束你如果使用这些字节数据,你可以按照你自己的功能逻辑做任意的转换。这个转换逻辑,不是bytes数据类型的功能范畴。

比如:对于字符,通常我们需要对其做一个编码转换,将字节类型转换为有意义的字符串。这个转换规则,就是字符编码,紧接着下一小节我们会介绍字符编码。

我们可以看到,bytes类型也是一种序列,所以它的大多数操作方法和String一致。

# 操作方法
print(bytes_3[0: 3])
print(bytes_1 + bytes_3)
print(b'h' in bytes_1)
print(bytes_1.split(b'l'))
print(bytes_1.find(b'll'))
print(bytes_1.replace(b'l', b't'))

输出结果为:

b'wor'

b'helloworld'

True

[b'he', b'', b'o']

2

b'hetto'

是不是和string类型高度一致? bytes类型和string类型的对比如下:

  • string的基本单位是字符,bytes的基本单位是字节;
  • 他们都是属于一种序列,所以对于序列的操作方法,对他们基本都适用;
  • String和bytes都是不可变类型,不能对其元素进行修改。

注意,虽然bytes通常会和string一起使用,但是bytes并不只是给string用,它本质上是一个字节串。Bytes适合那种面向二进制流的存储数据,比如图片、视频等多媒体,或者网络通信等二进制报文流。

  • 字节序

字节序,顾名思义就是字节存储的顺序。大家可能觉得奇怪,字节不都是“从左到右”依次存储的吗?怎么会有字节序的问题?大家看看下面的例子:

#  author: Tiger,    wx ID:tiger-python# file: ./6/6_2.py# bytes 按照16进制输出,强制不ascii转码
def trans(s):return "b'%s'" % ''.join('\\x%.2x' % x for x in s)# 字节序
byte_1 = 'python'.encode('utf-8')
print(trans(byte_1))print('Big endian: ', hex(int.from_bytes(byte_1, byteorder='big', signed=False)))
print('Little endian: ', hex(int.from_bytes(byte_1, byteorder='little', signed=False)))

输出结果为:

b'\x70\x79\x74\x68\x6f\x6e'

Big endian:  0x707974686f6e

Little endian:  0x6e6f68747970

上面的实例中,我们将bytes类型b’python’强制转换为int类型,在转换过程中分别指定其字节序为big和little。从打印结果可以看出,这两种类型对应的输出结果完全相反。它们对应的就是大端字节序(Big endian,BE)小端字节序(Little endian,LE)

比如我要存储一个字节串:b’\x12\x34\x56\x78’:

大端字节序:从低地址到高地址,依次存储数据字节;

小端字节序:相反,从高地址到低地址,依次存储数据字节。因为我们查看内存通常是由低位地址向高位地址看,所以大端字节序是更加符合我们的习惯的,而小端则相反。

为什么计算机会产生两种不同的字节序呢?

因为字节序是由CPU架构决定,而在计算机技术发展初期,CPU架构的两大阵营X86和PowerPC分别采用了完全相反的两种字节序,X86采用了LE,PowerPC采用了BE。所以,才会导致我们现在需要面对字节序的问题。

我们可以下面的方法获取当前cpu的字节序类型:

# 获取当前cpu的字节序类型import sys
print('endian of cur env:', sys.byteorder)

输出为:

endian of cur env: little

我使用的环境是X86的CPU,对应的是小端字节序。

如果你的程序只会在本地运行,不会涉及到跨主机(跨不同类型CPU)的操作,那么你不需要关注字节序。反之,你需要特别关注字节序,因为它容易出错。

如果计算机A采用了BE架构的CPU,计算机B采用了LE架构的CPU。我们有一段程序,在计算机A发送一个bytes : b’\x12\x34\x56\x78’给计算机B,那么计算机B解析出来的数据将是bytes : b’\x78\x56\x34\x12’,这就完全错了。

在这种跨主机的数据传输中的字节序,我们通常称之为网络字节序,网络字节序和CPU无关,它是网络通信协议定义的一套规范。几乎所有的网络字节序都采用了大端字节序BE。计算机将数据发送给网络协议之前,需要统一转换为网络字节序,同样,接收端的计算机从网络接收到数据后,也会统一将其由网络字节序转换为本机字节序。这样,我们就解决了跨主机的字节序问题。Python的网络编程里面,我们还会涉及到字节序,到时候我们可以回头来看看。

下一节我们继续讲字符编码和string与bytes直接的转换。


本节课程的视频和实例源码下载方式:点击->我的主页,查看个人简介。

我尽量坚持每日更新一节。

免费视频教程!零基础学Python系列(7) - 数据类型之bytes(上)相关推荐

  1. 零基础学python免费网课-零基础学Python量化投资,超值线上课程反复回看

    原标题:零基础学Python量化投资,超值线上课程反复回看 超值网络课程 量化投资是一种严谨.系统化的投资方式,相比起传统投资,量化投资风险低回报高,但是它要求投资者使用数据处理分析.计算机编程技术. ...

  2. python线上课程-零基础学Python量化投资,超值线上课程反复回看

    原标题:零基础学Python量化投资,超值线上课程反复回看 超值网络课程 量化投资是一种严谨.系统化的投资方式,相比起传统投资,量化投资风险低回报高,但是它要求投资者使用数据处理分析.计算机编程技术. ...

  3. python零基础电子书免费下载-零基础学Python

    准备自学Python朋友,不放来看看<零基础学Python>吧!小编这里为各位送上的是这本书的全彩PDF版,该书从初学者角度出发,通过通俗易懂的语言.流行有趣的实例,详细地介绍了使用IDL ...

  4. stata行业变量怎么赋值_免费视频教程!零基础学Python系列(3) 理解“变量”

    点击 跟哥一起学Python 关注我们 python变量(上) python变量(下) 实例源码 本节视频涉及到的实例源码,可以在百度网盘中下载.在公众号对话框回复关键字"网盘地址" ...

  5. 视频教程-数据挖掘基础:零基础学Python数据分析-大数据

    数据挖掘基础:零基础学Python数据分析 辽宁师范大学教师,特聘教授,硕士生导师.大数据与商务智能实验室主任. 李洪磊 ¥198.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术 ...

  6. 小甲鱼python课后题答案_小甲鱼python视频教程下载|小甲鱼零基础学python视频教程附习题答案_ - 极光下载站...

    小甲鱼零基础学python视频教程下载,最完整的小甲鱼python语言学习视频来啦,想要学习python语言的小白们不妨点击观看视频在下学习吧! Python语言介绍 Python是一种面向对象的解释 ...

  7. 编程没基础学python多长时间--零基础学Python,从入门到精通需要多长时间

    求一份小甲鱼的<零基础入门学习Python>视频教程 评论 本系列教程面向础的同学,是一个深入浅通俗易懂的Python3视频教程. 适群 完全零基础入门,不需要任何前置知识. 教程概述 前 ...

  8. python从入门到精通需要多久--零基础学Python,从入门到精通需要多长时间

    求一份小甲鱼的<零基础入门学习Python>视频教程 评论 本系列教程面向础的同学,是一个深入浅通俗易懂的Python3视频教程. 适群 完全零基础入门,不需要任何前置知识. 教程概述 前 ...

  9. 视频教程-零基础JS入门系列课程(2)之JS语法基础精讲-JavaScript

    零基础JS入门系列课程(2)之JS语法基础精讲 螺钉课堂讲师,擅长Vue.React.ReactNative.NodeJS等前端框架及技术 邓老师 ¥59.00 立即订阅 扫码下载「CSDN程序员学院 ...

最新文章

  1. 项目经验—Skype客户端内网无法共享PPT
  2. iptables(二)--扩展详解
  3. swift5表情键盘项目封装
  4. 关于CVE-2020-14882,你需要知道的都在这里
  5. mysql 2182_MySql常用命令总结
  6. Linux桌面鼠标取词自动翻译
  7. 华为手机序列号前三位_华为手机序列号怎么查询?
  8. php位运算符与逻辑运算_php 或_php 逻辑运算符和
  9. [关系图谱] 二.Gephi导入共线矩阵构建作者关系图谱
  10. 图形化开发(五)032-Three.js之光照——PointLight 点光源、SpotLight 聚光灯光源、实现聚光灯阴影、HemisphereLight室外光源
  11. 操作系统 设备基本概念和分类
  12. python——脚本实现检测目标ip是否存在ftp笑脸漏洞(ftp后门漏洞)
  13. 逆向破解——win7-vm逆向平台搭建
  14. 如何利用设备管理系统做好设备预防维护保养工作?
  15. mavlink协议_MAVLink学习之路03_XML中定义MSG并生成C代码
  16. 1.1初步了解和认识大数据
  17. springboot引入国际化
  18. flutter icon 大全
  19. Mac上好用的照片查看器
  20. 【DDD】三个火枪手原则和两个披萨原则

热门文章

  1. 【计算机网络】数据流简单分析
  2. html控制复选框选中,选中HTML复选框
  3. 数据压缩(十四)——AR模型的参数估计阅读
  4. 一文读懂运放的共模输入和输出
  5. Vue3数组使用push,导致数组每一个元素都改变
  6. 我国魏晋时期割圆法现在用计算机mn,割圆术
  7. 欧几里得算法和扩展欧几里得
  8. 使用scp命令传文件
  9. 深入分析: Vista后Windows 微软需要思考什么
  10. 张俊林:对比学习研究进展精要