访问一个字节中的半字节,将其附加到前一个字节,然后对其求值?
Accessing a nibble in a byte, appending it to the previous byte and then evaluating it?
我读入了一组 4 个字节。
b'\xc2\x0c\xe4\x8f'
这是小端数据,例如,我想访问一个参数,它是整个第一个字节和第二个字节的低位(右侧,B0-3))。所以我想要结束的是(在 bin 中):
1100 11000010
首先是第二个字节的下半部分,然后是第一个字节 - 计算结果为 3266。
我必须执行此操作的代码是:
packet=b'\xc2\x0c\xe4\x8f'
bin_str = '0b'+((format(packet[1],'08b'[-4:])+format(packet[1],'08b'))
decoded_data=int(bin_str, 2)
这与我预期的一样有效,但我不确定这是做事的最佳方式。我也尝试过使用按位运算,但让代码识别出我想采用 1 个半字节并以小字节顺序评估它们让我望而却步。如果它是两个完整的字节,我将只使用 int.from_bytes() 并且没有问题。
转换为字符串,进行文本操作并转换回来并不是完成如此简单任务的方法。试试这个:
b = b'\xc2\x0c\xe4\x8f'
n = 0x100*(b[1] & 0x0F) + b[0]
上面的代码仅结合了几个基本操作:检索单个字节、使用二进制与选择位等
具体来说,有4个输入字节:A B C D
.
b[0]
检索字节 A
,
b[1]
检索字节 B
B & 0xF
清除位 7 到 4:0 0 0 0 B3 B2 B1 B0
0x100 * value
(也就是value << 8
):添加8个零位(另一个空字节):
最后,将 1 + 4 相加得到:0 0 0 0 B3 B2 B1 B0 A7 A6 A5 A4 A3 A2 A1 A0
如何转换为 int 并对其进行模运算?
input = b'\xc2\x0c\xe4\x8f'
num = int.from_bytes(input, "little")
result = num % (2**12)
这款适合您需要吗?
我读入了一组 4 个字节。
b'\xc2\x0c\xe4\x8f'
这是小端数据,例如,我想访问一个参数,它是整个第一个字节和第二个字节的低位(右侧,B0-3))。所以我想要结束的是(在 bin 中):
1100 11000010
首先是第二个字节的下半部分,然后是第一个字节 - 计算结果为 3266。
我必须执行此操作的代码是:
packet=b'\xc2\x0c\xe4\x8f'
bin_str = '0b'+((format(packet[1],'08b'[-4:])+format(packet[1],'08b'))
decoded_data=int(bin_str, 2)
这与我预期的一样有效,但我不确定这是做事的最佳方式。我也尝试过使用按位运算,但让代码识别出我想采用 1 个半字节并以小字节顺序评估它们让我望而却步。如果它是两个完整的字节,我将只使用 int.from_bytes() 并且没有问题。
转换为字符串,进行文本操作并转换回来并不是完成如此简单任务的方法。试试这个:
b = b'\xc2\x0c\xe4\x8f'
n = 0x100*(b[1] & 0x0F) + b[0]
上面的代码仅结合了几个基本操作:检索单个字节、使用二进制与选择位等
具体来说,有4个输入字节:A B C D
.
b[0]
检索字节A
,b[1]
检索字节B
B & 0xF
清除位 7 到 4:0 0 0 0 B3 B2 B1 B0
0x100 * value
(也就是value << 8
):添加8个零位(另一个空字节):
最后,将 1 + 4 相加得到:0 0 0 0 B3 B2 B1 B0 A7 A6 A5 A4 A3 A2 A1 A0
如何转换为 int 并对其进行模运算?
input = b'\xc2\x0c\xe4\x8f'
num = int.from_bytes(input, "little")
result = num % (2**12)
这款适合您需要吗?