Python3.x中创建含组合int16的特定字节对象的技术求助
如何构造目标Python字节对象
首先,我们先明确你要生成的目标字节对象:b"'\x10\x00\x0020180425",拆解后对应的字节序列是:[39, 16, 0, 0, 50, 48, 49, 56, 48, 52, 50, 53](其中39是单引号'的ASCII码)。
你提到前几个字节\x10\x00\x00由两个int16类型数据组合而成——结合目标来看,这应该是指一个大端存储的int16值(0x1000,即十进制2560)加上另一个int16值(0x0000)的高字节,这样组合起来正好是\x10\x00\x00。
下面给你几种简洁可靠的实现方法:
方法1:使用struct模块(推荐)
struct模块专门用于处理Python值与C结构体字节序列的转换,能轻松处理端序问题,代码更简洁:
import struct # 1. 打包第一个int16(2560,大端格式,对应字节\x10\x00) int16_part1 = struct.pack('>H', 2560) # 2. 打包第二个int16(0)并取高字节(对应\x00) int16_part2 = struct.pack('>H', 0)[0:1] # 3. 拼接所有部分:单引号 + int16片段 + 字符串字节 target_bytes = b"'" + int16_part1 + int16_part2 + b"20180425" print(target_bytes) # 输出:b"'\x10\x00\x0020180425"
如果想更紧凑,也可以合并打包步骤:
import struct # 打包两个int16,取前3字节,再拼接其他部分 prefix = struct.pack('>HH', 2560, 0)[:3] target_bytes = b"'" + prefix + b"20180425"
方法2:手动操作bytearray(类似你的原始思路)
如果你更倾向于手动拆分字节,可以修正你的原始代码,注意选择正确的int16值和端序处理:
import numpy as np # 初始化bytearray,先加入单引号 blebytes = bytearray(b"'") # 第一个int16:2560(0x1000),大端存储,高字节0x10,低字节0x00 z = np.int16(2560) blebytes.append((z & 0xFF00) >> 8) # 取高字节:0x10 blebytes.append(z & 0x00FF) # 取低字节:0x00 # 第二个int16:0,取高字节0x00 z = np.int16(0) blebytes.append((z & 0xFF00) >> 8) # 加入后面的字符串字节 blebytes.extend(b"20180425") print(bytes(blebytes)) # 输出:b"'\x10\x00\x0020180425"
为什么你的原始代码没成功?
你之前用了np.int16(20)和np.int16(123),这两个值对应的大端字节分别是\x00\x14和\x00\x7B,组合起来是\x00\x14\x00\x7B,显然和目标的\x10\x00\x00不符。核心问题是选择的int16值不对,需要用2560(0x1000)来得到\x10\x00的字节序列。
内容的提问来源于stack exchange,提问作者Simon K
相关产品推荐
相关产品推荐

