介绍

大端模式,小端模式指的是数据在内存地址中存储的顺序不同。

打开python交互终端,输入如下代码就可以看到自己电脑是采用哪种存储顺序了。

>>> import sys
>>> print(sys.byteorder)
'little'

由于最初计算机设计事先没商量好,造成了数据在内存中的实际存储顺序有的是从大端(内存高地址)开始存储,有的是从小端(内存低地址)开始存储。常见的比喻就是吃鸡蛋时应该先从大头剥还是先从小头剥,其实对于吃鸡蛋来说没有任何影响(上学时老师也是用的这个比喻,真是栗子恒久远,一颗永流传~~)。但网络传输规定,数据在传输时,必须统一采用大端法进行传输。

一般操作系统都是小端,而通讯协议是大端的,所以我们在传输数据时,需要将数据转码。

一、字符串

今天在调接口时,就遇了一个这样的接口:

将双字节文字使用Big Endian编码后,转为16进制HEX字符串传输。

这个描述让我费了好大功夫去搜python3应该怎样实现。其实就是分两步:

  1. 将内容使用utf-16-be编码去encode。
  2. 将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 TypeSizeRange
short2 bytes-32,768 to +32,767
unsigned short2 bytes0 to +65,535
int4 bytes-2,147,483,648 to +2,147,483,647
unsigned int4 bytes0 to +4,294,967,295
classmethod int.from_bytes(bytes, byteorder, *, signed=False)

参数解释同上

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐