字节序的大端和小端

字节序

字节序(Byte Order)是指在多字节的数据类型(如整型、浮点型等)在内存中存储时,字节的排列顺序。
大端字节序(Big-Endian):高位字节存储在低位地址,低位字节存储在高位地址。比如整数值 0x12345678,在内存中的存储顺序是:0x12(高位字节) 0x34 0x56 0x78(低位字节)。
小端字节序(Little-Endian):低位字节存储在低位地址,高位字节存储在高位地址。比如整数值 0x12345678,在内存中的存储顺序是:0x78(低位字节) 0x56 0x34 0x12(高位字节)。
在计算机系统中,有些 CPU 采用大端字节序,有些 CPU 采用小端字节序,因此在进行数据交换时需要注意字节序的问题,否则可能会导致数据解析错误。例如,在网络传输数据时需要将数据从本机的字节序转换为网络字节序(通常采用大端字节序)进行传输,接收端需要将数据从网络字节序转换为本机字节序进行解析。

0x代表什么

在计算机科学中,0x是一个前缀,表示其后的数字是十六进制数(Hexadecimal Number)。十六进制数是一种数学表示方法,使用 16 个不同的符号来表示数码,包括 0、1、2、3、4、5、6、7、8、9、A、B、C、D、E 和 F,其中 A 到 F 分别表示 10 到 15。

与十进制数(Decimal Number)一样,十六进制数也可以表示数字和字符。在计算机系统中,通常使用十六进制数来表示内存地址、字节值等数据。使用十六进制数能够简化二进制数据的表示和处理,因为每一位十六进制数恰好对应 4 位二进制数。

例如,0x10 表示十六进制数 16,它的二进制表示为 00010000;0xFF 表示十六进制数 255,它的二进制表示为 11111111。

python的struct库函数转换进制

Python 的 struct 模块提供了一些函数,可以方便地进行二进制数据和 Python 数据类型之间的转换。其中包括了将二进制数据转为十六进制字符串的函数 hexlify(),以及将二进制数据转为 Python 数据类型的函数 unpack()。

以下是使用 struct 模块将字节序列 “be40ee1b” 转换为十六进制字符串和十进制数的示例代码:

import struct

# 将字节序列转为二进制数据
data = bytes.fromhex('be40ee1b')

# 将二进制数据转为十六进制字符串
hex_str = data.hex()
print(hex_str)  # 输出:be40ee1b

# 将二进制数据转为四个无符号整数
# "B" 表示一个无符号字节,">" 表示大端字节序
num1, num2, num3, num4 = struct.unpack(">BBBB", data)
print(num1, num2, num3, num4)  # 输出:190 64 238 27

# 将二进制数据转为一个有符号整数
# "i" 表示一个有符号四字节整数,">" 表示大端字节序
num = struct.unpack(">i", data)[0]
print(num)  # 输出:-1104866253

在上面的代码中,bytes.fromhex() 函数将字节序列转为二进制数据,data.hex() 函数将二进制数据转为十六进制字符串。struct.unpack() 函数将二进制数据转为指定的 Python 数据类型,其中 “>BBBB” 表示将数据按大端字节序解析为四个无符号字节,“>i” 表示将数据按大端字节序解析为一个有符号四字节整数。

你可能感兴趣的:(python,字节序,struct库)