字符

字符是一个信息单位,简单来讲就是一个字母、数字、标点符号、汉字等。

字符的最佳定义是Unicode字符:

它是一个全球化的标准,能表示世界上所有语言的字符。Unicode字符的标识(码位)是以4~6个十六进制数字表示的,并且加前缀U+

字节

字节是计算机信息计量单位,一个字节代表八个比特,存储的数值范围为0~255。

字节跳动(ByteDance)互联网公司的字节就是这个字节。

字节是机器的,字符是人类的。

把人类字符转换为机器字节时使用的算法叫做编码,反之叫做解码。

算法不同,字节与字符的关系也不同:

bytes和bytearray

字节实际上是个二进制序列。不可变bytes类型和可变bytearray类型是用来存储二进制序列的,它们的示例如下:

>>> cafe = bytes("café", encoding="utf_8")
>>> cafe
b'caf\xc3\xa9'
>>> cafe[0]
99
>>> cafe[:1]
b'c'
>>> cafe_arr = bytearray(cafe)
>>> cafe_arr
bytearray(b'caf\xc3\xa9')
>>> cafe_arr[-1:]
bytearray(b'\xa9')

特别的是cafe[0]返回了整数,cafe[:1]返回了二进制序列,这是因为s[0] == s[:1]只对str类型成立,而对于其他类型来说,s[i]返回一个元素,s[i:i+1]返回一个相同类型的序列。

二进制序列实际上是整数序列。它们的字面量表示法包含ASCII字符(ASCII只能表示英文体系的字符),比如cafe的b'caf\xc3\xa9',具体规则是:

  • 从空格到~的字符直接使用ASCII字符
  • 制表符\t、换行符\n、回车符\r、转义符\\
  • 其他字符用十六进制转义序列,比如\x00空字节

构建bytes和bytearray对象的方式有以下几种:

  1. 一个str对象和一个encoding关键字参数
  2. 一个可迭代对象,数值在0~255
  3. 一个实现了缓冲协议的对象,如bytes、bytearray、memoryview、array.array

memoryview和struct

memoryview允许在二进制数据结构之间共享内存,struct能从序列中提取结构化信息。

示例如下,提取一个GIF图像的宽度和高度:

import struct

with open("filter.gif", "rb") as fp:
img = memoryview(fp.read()) # 这里不会复制字节序列,因为用的memoryview
header = img[:10]
print(bytes(header)) # b'GIF89a+\x02\xe6\x00' # <是小字节序,3s3s是两个3字节序列,HH是两个16位二进制整数
# 类型、版本、宽度、高度
struct.unpack("<3s3sHH", header) # (b'GIF', b'89a', 555, 230) # 删除引用,释放memoryview实例所占的内存
del header
del img

小结

本文介绍了字符和字节的概念以及它们之间的关系,一个字符对应一个或多个字节。字符是人类的,字节是机器的,编码就是人类字符转换为机器字节,反之叫做解码。然后分别介绍了二进制序列的类型bytes和bytearray,和二进制序列的工具memoryview和struct。

参考资料:

《流畅的Python》

http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

https://zh.wikipedia.org/wiki/字符_(计算机科学)

https://home.unicode.org/

https://zh.wikipedia.org/wiki/字节

https://www.runoob.com/w3cnote/byte-character.html

Python字符与字节新编的更多相关文章

  1. python 字符与字节 json序列和反序列及支持的类型

    b = b"demo" s = "demo" # 字符串转字节 s = bytes(s, encoding = "utf8") s = st ...

  2. Python编程Day7——字符编码、字符与字节、文件操作

    一.字符编码 重点 ***** 1. 什么是字符编码:将人识别的字符转换计算机能识别的01,转换的规则就是字符编码表2. 常用的编码表:ascii.unicode.GBK.Shift_JIS.Euc- ...

  3. python第七天(字符编码,字符与字节,文件操作)

    一.字符编码: 定义:将人识别的字符转换成计算机能识别的0和1,转换的规则就是字符编码表. 常见编码表:ascii.unicode.GBK 编码表: 1.采用的都是unicode编码表 2.unico ...

  4. python字符类型的一些方法

    python 字符串和字节互转换.bytes(s, encoding = "utf8") str(b, encoding = "utf-8") i.isspac ...

  5. python 字符编码练习

    通过下面的练习,加深对python字符编码的认识 # \x00 - \xff 256个字符 >>> a = range(256)>>> b = bytes(a) # ...

  6. Python字符编码讲解

    声明:本文参考 Python字符编码详解 在计算机中我们不管用什么语言和程序,最终数据在计算机中的都是字节码(也就是01形式)的形式存在的,如果 计算机直接把字节码显示在屏幕上,很明显一般人看不懂字节 ...

  7. 深入理解Python字符编码--转

    http://blog.51cto.com/9478652/2057896 不论你是有着多年经验的 Python 老司机还是刚入门 Python 不久,你一定遇到过UnicodeEncodeError ...

  8. Python 字符编码及其文件操作

    本章节内容导航: 1.字符编码:人识别的语言与机器机器识别的语言转化的媒介. 2.字符与字节:字符占多少个字节,字符串转化 3.文件操作:操作硬盘中的一块区域:读写操作 注:浅拷贝与深拷贝 用法: d ...

  9. 深入理解Python字符编码

    不论你是有着多年经验的 Python 老司机还是刚入门 Python 不久,你一定遇到过UnicodeEncodeError.UnicodeDecodeError 错误,每当遇到错误我们就拿着 enc ...

随机推荐

  1. poj2987最大权闭包(输出最少建塔个数)

    题意:      公司要裁员,每个员工被裁掉之后都会有一定的收益(正或者负),有一些员工之间有限制关系,就是裁掉谁之前必须要先裁掉另一个人,问公司的最大收益和最大收益前提下的最小裁员人数? 思路:   ...

  2. hdu3415单调队列

    题意:       给你一个数字组成的环,要求在里面找到一个最大的子序列,使得和最大,要求: (1)子序列长度不能超过k (2)如果子序列和相同要起点最小的 (3)如果起点相同要长度最小的 思路:   ...

  3. CVE-2013-1347:从入门到放弃之调试分析令人崩溃的 Microsoft IE CGenericElement UAF 漏洞

    0x01 2013 年 "水坑" APT 攻击事件 在 2013 年 5 月,美国的劳工部网站被黑,利用的正是 CVE-2013-1347 这个漏洞,在当时导致大量使用 IE8 访 ...

  4. Windowsw核心编程 第13章 Windows内存结构

    第1 3章 Wi n d o w s的内存结构 13.1 进程的虚拟地址空间 每个进程都被赋予它自己的虚拟地址空间.对于 3 2位进程来说,这个地址空间是4 G B,因为3 2位指针可以拥有从0 x  ...

  5. Linux-鸟菜-0-计算机概论

    Linux-鸟菜-0-计算机概论 这一章在说计算机概论,额....,总的来说看完之后还是有点收获,回忆了下计算机基本知识.没有什么可上手操作的东西,全是概念,直接把最后的总结给截图过来吧,因为概念的话 ...

  6. Gridea博客无法载入CSS样式的解决办法

    今日在使用Gridea客户端更新博客的过程中,推送到远端仓库后内容显示正常,但是无法载入主题样式,就是没有载入CSS样式,折腾了一下午在搞懂问题出在哪里了,下面说一下自己的解决思路. 问题描述 首先, ...

  7. Asp.NetCore Web开发之ADO.Net

     Asp.NetCore可以说是.Net平台开发网站的一大利器,最近的一大段时间,就要跟大家分享,如何使用这一利器开发网站项目. 要学习网站开发,首先要学习如何使用ADO.Net进行数据库数据的增删改 ...

  8. 【Redis破障之路】四:Jedis基本使用

    在前面我们已经学习了Redis命令行客户端redis-cli的使用,接下来我们了解一下Redis基于Java编程语言的客户端. 在Java语言体系下,有三个常用的Redis客户端Jedis.Redis ...

  9. Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/collect/ImmutableMap

    selenium + java + mac + idea 报错分析: 网上搜的教程,配置selenium 自动化测试环境,都是只让导入 client-combined-3.141.59-sources ...

  10. Linux服务之nginx服务篇三(反向代理、负载均衡)

    一.Nginx实现反向代理 概念 反向代理:在收到客户端请求之后,会修目标IP地址和端口 正向代理:在收到客户端请求之后,会修源IP地址和端口 上游服务器:代理服务器后端的哪些真正给客户端提供服务的节 ...