Python逐位操作,对现有variab进行更改

2024-04-29 01:08:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我在根据掩码分配的13位中设置一个值(PID)。。我试图在第4位设置一个标志,同时在13位掩码中保留原始值。。你知道吗

enter image description here

想法??你知道吗

header =    0x0

pid_mask =  0x1fff
TP_mask =   0x2000
PID =       0x1FFe #8190
TP =        0x1

header = ((header & pid_mask) | (PID << 8))

print(bin(header))
print(hex(header))
print(int(header))

header = ((header & TP_mask) | (TP << 12))


print(bin(header))
print(hex(header))
print(int(header))

这是我的输出

这部分很好(第一次打印语句)

0b111111111111000000000
0x1ffe00
2096640

这部分我希望是上面+额外的位翻转(第二次打印语句)

0b11000000000000
0x3000
12288

更新

我是个十足的木偶,多亏了@Lesiak的帮助

这是最新的代码

def createHeader(pid,tei,pusi,tranportPriority,tsc,afc,cc):

header = pid << 8

if tei == 1:
    header = header | (0x1 << (22 + 1))
    print(bin(header))
if pusi == 1:
    header = header | (0x1 << (21 + 1))
    print(bin(header))
if tranportPriority == 1:
    header = header | (0x1 << (8 + 13))
    print(bin(header))


    header = header | (tsc << 6)
    print(bin(header))
    header = header | (afc << 4)
    print(bin(header))
    header = header | (cc << 0)
    print(bin(header))

print(hex(header))

return header


header = (createHeader(pid,1,1,1,0x1,0x1,0x2))

我唯一的问题是必须切掉最后一个字节头[1:4],因为它返回4个字节而不是3个字节。不知道为什么。。。。你知道吗


Tags: if字节binmask语句teipidint
1条回答
网友
1楼 · 发布于 2024-04-29 01:08:43

您正在从头开始构造一个新数据包。 使用位掩码是没有意义的。 只需将适当的数据包块放在各自的位置。要确定正确的位置,请检查您的协议定义并计算字段中的位数以填充低有效位。你知道吗

PID =       0x1FFe #8190
TP =        0x1

header = PID << 8

print(bin(header))
print(hex(header))
print(int(header))

header = header | (TP << (8 + 13))


print(bin(header))
print(hex(header))
print(int(header))

在相反的情况下,您应该使用位掩码:您收到一个数据包并希望从中提取数据。你知道吗

更新

我是如何实现PID的8位移位和TP的21位移位的? 看看协议定义: PID后面有8位(它们位于较低有效位上)

  • 4用于连续性计数器
  • 2适用于现场控制
  • 2用于传输加扰控制

对于TP:

  • 上面列表中的8位
  • PID为13位

相关问题 更多 >