extend() 方法的处理和to_bytes(2, ‘big‘) 方法的作用

先看代码

# 假设 register_addr 是一个寄存器地址
register_addr = 0x1234

# 初始化一个空列表作为 message
message = []

# 将 register_addr 转换为 2 字节的大端字节序表示,并添加到 message 列表中
message.extend(register_addr.to_bytes(2, 'big'))

print(message)  # 输出: [18, 52],因为 0x12 十进制是 18,0x34 十进制是 52

代码中是将十六进制数 0x1234 拆分成 0x12 和 0x34 ,并将它们分别转换为十进制的 18 和 52 存储在列表中,他为什么不输出一个0x12和0x34?下面详细解释这个转换过程及遵循的逻辑。

转换步骤分析

1. to_bytes(2, 'big') 方法的作用

register_addr.to_bytes(2, 'big') 这部分代码会把整数 register_addr(其值为十六进制的 0x1234 )转换为长度为 2 字节的大端字节序表示。

  • 大端字节序(Big Endian):高位字节存放在低地址,低位字节存放在高地址。对于 0x1234 ,高字节是 0x12 ,低字节是 0x34 。因此,经过 to_bytes(2, 'big') 转换后,得到的字节对象表示为 b'\x12\x34' 。这里的 b 表示这是一个字节对象,\x12 和 \x34 分别代表十六进制的 0x12 和 0x34 。
2. extend() 方法的处理

message.extend(register_addr.to_bytes(2, 'big')) 这行代码会将字节对象 b'\x12\x34' 中的每个字节依次添加到 message 列表中。在 Python 里,当把字节对象中的元素添加到列表时,每个字节会以十进制整数的形式呈现。

  • 字节到十进制整数的转换:在计算机中,字节是由 8 位二进制数组成的,其取值范围是 0 到 255 。十六进制数 0x12 转换为二进制是 0001 0010 ,对应的十进制数是 18;十六进制数 0x34 转换为二进制是 0011 0100 ,对应的十进制数是 52 。所以,message 列表最终存储的就是 [18, 52] 。

你可能感兴趣的:(python)