一、编解码简介

1、编码

在显示器上看见的文字、图片等信息在电脑里面其实并不是我们看见的样子,即使你知道所有信息都存储在硬盘里,把它拆开也看不见里面有任何东西,只有些盘片。假设,你用显微镜把盘片放大,会看见盘片表面凹凸不平,凸起的地方被磁化,凹的地方是没有被磁化;凸起的地方代表数字1,凹的地方代表数字0。硬盘只能用0和1来表示所有文字、图片等信息。那么字母”A”在硬盘上是如何存储的呢?可能小张计算机存储字母”A”是1100001,而小王存储字母”A”是11000010,这样双方交换信息时就会误解。比如小张把1100001发送给小王,小王并不认为1100001是字母”A”,可能认为这是字母”X”,于是小王在用记事本访问存储在硬盘上的1100001时,在屏幕上显示的就是字母”X”。也就是说,小张和小王使用了不同的编码表。小张用的编码表是ASCII,ASCII编码表把26个字母都一一的对应到2进制1和0上;小王用的编码表可能是EBCDIC,只不过EBCDIC编码与ASCII编码中的字母和01的对应关系不同。一般地说,开放的操作系统(LINUX 、WINDOWS等)采用ASCII 编码,而大型主机系统(MVS 、OS/390等)采用EBCDIC 编码。在发送数据给对方前,需要事先告知对方自己所使用的编码,或者通过转码,使不同编码方案的两个系统可沟通自如。

总而言之,有了编码,便可以将机器语言逐渐翻译成自然语言。

2、unicode编码

如上ANSI编码条例中所述,世界上存在着多种编码方式,在ANSi编码下,同一个编码值,在不同的编码体系里代表着不同的字。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码,可能最终显示的是中文,也可能显示的是日文。在ANSI编码体系下,要想打开一个文本文件,不但要知道它的编码方式,还要安装有对应编码表,否则就可能无法读取或出现乱码。为什么电子邮件和网页都经常会出现乱码,就是因为信息的提供者可能是日文的ANSI编码体系和信息的读取者可能是中文的编码体系,他们对同一个二进制编码值进行显示,采用了不同的编码,导致乱码。这个问题促使了unicode码的诞生。

总而言之,unicode码用于解决数字与二进制的映射,进而方便翻译成自然语言。

3、ASCII、GB2312、GBK编码

每个unicode数字用固定宽度的二进制位表示,比如都用两字节,由此产生了ASCII、GB2312、GBK编码。

4、UTF-8编码

存储的二进制位除了表示数字之外,还表示每个unicode数字的长度,由此产生了utf-8编码。

二、实战:字节与字符串相互转换

import binascii
import structdata_zh = "网络超时"
data_en = "timeout"# 一、字符串转字节
# 1.1、中文字符串转字节(不同编码格式展示):直接选择编码方式进行编码,就能转字节
gb_zh = data_zh.encode("GB2312")
print(gb_zh)  # b'\xcd\xf8\xc2\xe7\xb3\xac\xca\xb1'
gbk_zh = data_zh.encode("GBK")
print(gbk_zh)  # b'\xcd\xf8\xc2\xe7\xb3\xac\xca\xb1'  备注:GB2312是GBK的子集
utf_zh = data_zh.encode("utf-8")
print(utf_zh)  # b'\xe7\xbd\x91\xe7\xbb\x9c\xe8\xb6\x85\xe6\x97\xb6'
# print(data_zh.encode("ASCII"))  # 不支持# 1.2、英文字符串转字节(不同编码格式展示):直接选择编码方式进行编码,就能转字节
gb_en=data_en.encode("GB2312")
print(gb_en)  # b'timeout'
gbk_en=data_en.encode("GBK")
print(gbk_en)  # b'timeout'
utf_en = data_en.encode("utf-8")
print(utf_en)  # b'timeout'
asc_en=data_en.encode("ASCII")
print(asc_en)  # b'timeout'# 1.3、字符串转16进制字节:先将字符串转字节,再转16进制
gb_zh_16 = binascii.b2a_hex(gb_zh)
print(gb_zh_16)  # b'cdf8c2e7b3accab1'
gb_en_16=binascii.b2a_hex(gb_en)
print(gb_en_16)  # b'74696d656f7574'# 1.4、任意字符为16进制的字符串转字节:直接编码即可
gb_zh_16_str='cdf8c2e7b3accab1'
print(bytes().fromhex(gb_zh_16_str))  # b'\xcd\xf8\xc2\xe7\xb3\xac\xca\xb1'# 1.5、任意字符为16进制的字符串转16进制字节:直接编码即可
gb_zh_16_str='cdf8c2e7b3accab1'
print(gb_zh_16_str.encode())  # b'cdf8c2e7b3accab1'# 二、数字转字节
# 2.1、数字转普通字节、大端序或小端序字节:直接通过struct模块打包实现
num = 123
print(struct.pack('@L', num))  # b'{\x00\x00\x00'  按原字节转化成的普通字节
print(struct.pack('=L', num))  # b'{\x00\x00\x00'  按标准方式转化成的普通字节
print(struct.pack('<L', num))  # b'{\x00\x00\x00' 小端序字节,相关参数请参考文章:https://blog.csdn.net/weixin_43431593/article/details/122078688
print(struct.pack('>L', num))  # b'\x00\x00\x00{' 大端序字节# 2.2、数字转16进制字节:先将数字转化成字节,再将字节格式化成16进制
num_byte = struct.pack('@L', num)
print(binascii.b2a_hex(num_byte))  # b'7b000000' 字符串类型  注意,原编码决定了16进制长度和排序# 三、数字转字符串
# 3.1、数字转普通字符串
print(str(num))  # 123 字符串
# 3.2、数字转16进制字符串
print(hex(num))  # 0x7b# 四、字节转字符串
# 4.1、任意字节均为16进制字符串,转字符串:直接转即可
print(binascii.b2a_hex(num_byte).decode())  # 7b000000  字符串
# 4.2、普通字节转16进制字符串:先将字节进行16进制处理,再转字符串
# print(num_byte.decode())  # 非16进制字符串,直接解不出来
num_byte_16=binascii.b2a_hex(num_byte)
print(num_byte_16.decode())  # 7b000000  字符串# 五、字节转数字
# 4.1、普通字节转数字:需要知道原先的编码方式
print(struct.unpack('@L', num_byte))  # (123,)
# 4.2、任意字节都为16进制的字节转数字:先转化成字符串,再数字
print(int(num_byte_16.decode(), 16))  # 2063597568

python编解码的字节与字符串相互转换相关推荐

  1. 盘点一个JS逆向过程中中文编解码的小案例

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 空山不见人,但闻人语响. 大家好, ...

  2. Python学习教程:Python3内置模块之base64编解码方法小结

    Python学习教程:Python3内置模块之base64编解码方法小结 概述 Base64 是网络上最常见的用于传输 8Bit 字节码的编码方式之一,Base64 就是一种基于 64 个可打印字符来 ...

  3. python解码asn_使用asn1tools进行asn1编解码

    最近在做3GPP的编解码,发现有两个第三方库比较好用.一个是ASN1C(c语言编译环境),一个是python第三方库asn1tools.这里介绍下asn1tools的使用方法: 1 第一步:生成asn ...

  4. gif编解码python实战

    前言:去年曾写过一个维信机器人,目的是为了方便管理我个人建的一个微信群,当时想在维信消息里面做个带UI的小游戏,但是会受到微信消息框的约束,思来想去,就干脆通过gif来呈现吧,大致就是用户在微信群里发 ...

  5. python字符串转换字节_python 字节与字符串转换

    1.如果没有设置字符串编码格式,那么将采用系统默认编码格式 name = 'laogaoyang' # 采用系统默认编码格式 nameBytes = name.encode('utf-8') # 先将 ...

  6. python 图片base64 编解码,转换成Opencv,PIL.Image图片格式

    Python PIL.Image和OpenCV图像格式相互转换 二进制打开图片文件,base64编解码转成Opencv格式: # coding: utf-8 import base64 import ...

  7. python 字节和字符串区别,Python中字节串和字符串,不是一个概念没有区别之分...

    1.字节概念 字节(Byte )是计算机信息技术用于计量存储容量的一种计量单位,作为一个单位来处理的一个二进制数字串,是构成信息的一个小单位.最常用的字节是八位的字节,即它包含八位的二进制数. 位:( ...

  8. Python基于二维码实现的在线编解码系统

    目 录 摘 要 I Abstract II 第一章 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 工作环境和背景 2 1.3.1 操作系统 3 1.3.2 编程语言 3 1.3.3编码 ...

  9. Python学习笔记(八)爬虫基础(正则和编解码)

    知识点 正则 正则匹配url,引用re库,将需要匹配的字段用(.*?)来匹配,可以匹配任何字符串.如果有换行,可以用如下方式解决: 1. ([\s\S]*?) 2. re.findall(reg,ht ...

  10. 字节跳动视频编解码面经

    引言 本文主要是记录一下面试字节跳动的经历. 三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直 ...

最新文章

  1. Java中程序初始化的顺序
  2. CynosDB技术详解——存储集群管理【文末有福利】
  3. Ubuntu/Fedora 编译内核教程
  4. Java NIO示例:多人网络聊天室完整代码
  5. Python爬虫之旅_TWO
  6. 排序算法——基数排序
  7. 第三次学JAVA再学不好就吃翔(part101)--IO流
  8. 使用ST05 研究product extension field deletion
  9. fiddler运行原理_全网最全最细的fiddler使用教程以及工作原理
  10. Java小案例(二) 用数组实现增删查改排序
  11. 【算法基础笔记】常用的排序算法的时间、空间复杂度,部分排序算法原理
  12. selenium +chrome headless Adhoc模式渲染网页
  13. Linux C/C++编程之(十六)进程及进程控制
  14. FSM实例——按键消抖及状态检测
  15. 【NeurIPS 2019】Yoshua Bengio报告:深度学习系统从1代到2代中的基础知识
  16. Scrum板与Kanban如何抉择?jlqpzlmlp板与按照znbpdl
  17. 无线网络连接不上请检查服务器,为什么无线网络连接不上?
  18. Hbuilder X npx browserslist@latest --update-db
  19. win7下登录中国银行网银,叫你四步搞定!
  20. bugku writeup(misc_1)

热门文章

  1. Unity3D打包apk的主界面和android组件共同显示
  2. docker安装elasticsearch教程
  3. 硬盘坏道修复软件测试工程师,硬盘坏道检测,教您如何修复硬盘坏道
  4. win10易升_win10上跑Ubuntu不用虚拟机不用双系统!
  5. 与时俱进的迅捷多功能转换器
  6. STM32 485通信芯片引脚应用讲解
  7. JAVA打印中文乱码问题
  8. 关于yolo3的学习
  9. 推荐一款能够将爱奇艺qsv、腾讯qlv、优酷kux完美转换成mp4的三合一全能格式转换器
  10. 计算机网络 全章节思维导图