python3大端、小端(Big Endian、LittleEndian)编码
大端模式,小端模式指的是数据在内存地址中存储的顺序不同。一般操作系统都是小端,而通讯协议是大端的,所以我们在传输数据时,需要将数据转码。今天在调接口时,就遇了一个这样的接口:将双字节文字使用Big Endian编码后,转为16进制HEX字符串传输。这个描述让我费了好大功夫去搜python3应该怎样实现。其实就是分两步:1. 将内容使用utf-16-be编码去encode。2. 将en.......
介绍
大端模式,小端模式指的是数据在内存地址中存储的顺序不同。
打开python交互终端,输入如下代码就可以看到自己电脑是采用哪种存储顺序了。
>>> import sys
>>> print(sys.byteorder)
'little'
由于最初计算机设计事先没商量好,造成了数据在内存中的实际存储顺序有的是从大端(内存高地址)开始存储,有的是从小端(内存低地址)开始存储。常见的比喻就是吃鸡蛋时应该先从大头剥还是先从小头剥,其实对于吃鸡蛋来说没有任何影响(上学时老师也是用的这个比喻,真是栗子恒久远,一颗永流传~~)。但网络传输规定,数据在传输时,必须统一采用大端法进行传输。
一般操作系统都是小端,而通讯协议是大端的,所以我们在传输数据时,需要将数据转码。
一、字符串
今天在调接口时,就遇了一个这样的接口:
将双字节文字使用Big Endian编码后,转为16进制HEX字符串传输。
这个描述让我费了好大功夫去搜python3应该怎样实现。其实就是分两步:
- 将内容使用utf-16-be编码去encode。
- 将encode后的内容转为16进制的字符串。
import binascii
import sys
print("本机存储模式是{} Endian.\n".format(sys.byteorder.capitalize()))
content = "待传输中文文本" # content是str类型
print("原文本为:", content, '\n')
# 先看最终代码
result = binascii.b2a_hex(content.encode('utf-16-be'))
print("编码后文本为:", result, '\n')
content = binascii.a2b_hex(result).decode('utf-16-be')
print("解码后文本为:", content, '\n')
# ————————————————————————————————————————————————
# 下面开始解释代码
# 解释编码
coded = content.encode('utf-16-be') # coded是bytes类型,uft-16就不解释了,be是Big Endian的缩写。
print("使用utf-16-be编码后为:", coded, '\n')
result = binascii.b2a_hex(coded) # b2a应该是bytes to ascii,hex就是16进制的意思,b2a_hex方法和hexlify方法是相同的。
print("utf-16-be转为hex为:", result, '\n')
# 解释解码
coded = binascii.a2b_hex(result) # 同理a2b应该是ascii to bytes,hex也是16进制的意思,a2b_hex方法和unhexlify方法是相同的。
print("hex转为utf-16-be为:", coded, '\n')
content = coded.decode('utf-16-be')
print("utf-16-be解码后的原文本为:", content, '\n')
二、整数(2022-07-29更新)
参考python官网:https://docs.python.org/zh-cn/3/library/stdtypes.html#int.to_bytes
# 整数转为Big Endian字节码
1024.to_bytes(2, byteorder='big')
# b'\x04\x00'
# 将Big Endian字节码转为整数
int.from_bytes(b'\x04\x00',byteorder='big')
# 1024
看一下两个函数的方法签名:
int.to_bytes(length, byteorder, *, signed=False)
- length: 用几个字节来表示数据,示例中的1024用“2”字节表示即可,如果数字大小超过字节可表示的范围,会报
OverflowError
异常 - byteorder: 选择用哪种编码,“big”或“little”
- signed: 编码的数据是否有符号(正/负),默认
False
表示无符号,如果待编码数据为负数,需要将参数值改为True
补充不同字节代表的整数范围:
Data Type | Size | Range |
---|---|---|
short | 2 bytes | -32,768 to +32,767 |
unsigned short | 2 bytes | 0 to +65,535 |
int | 4 bytes | -2,147,483,648 to +2,147,483,647 |
unsigned int | 4 bytes | 0 to +4,294,967,295 |
classmethod int.from_bytes(bytes, byteorder, *, signed=False)
参数解释同上
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)