我应该根据以下3个值来确定位掩码和移位值:起始字节、起始位和位数。
我将收到一些字节数组,用于我的x个字节的数据。假设这个大字节数组中的一些随机数据块表示灯开关是开还是关。因此,我将重点介绍本例中的单字节/8位数据。这8位中的3位用于确定灯开关的开/关状态。
因此,我所知道的关于这块数据的所有信息都是这3个固定值:这个字节数组中的起始字节位置,这个特定字节本身中的起始比特位置,以及为表示这个灯开关的开/关状态而分配的位数。
因此,在这个特定的示例中,字节位置是字节15 (在这个由x个字节组成的大型字节数组中)。起始位位置为0。位数为3(因为在该字节内分配了3位来表示开/关状态)。
我的问题是:如何根据这3个固定值计算位掩码和位移位值?我知道计算可能涉及基数2或2的幂,但不确定。
提前感谢
发布于 2021-08-04 21:48:12
给定一个具有以下索引方案的字节数组...
byte ,--0---, ,--1---, ,--2---, ...
bit 76543210 76543210 76543210 ...可以在单个(!)中提取位序列byte使用以下方法
public byte extract(byte[] array, int startByte, int startBit, int numberOfBits) {
return (byte) ((array[startByte] >> startBit) & ~(-1 << numberOfBits));
}startBit + numberOfBits必须为≤8。否则,所寻址的位序列将跨越数组中的多个字节。在这种情况下,您可以将非常相同的原则应用于连接在一起的下一个字节:
public uint extract32(byte[] array, int startByte, int startBit, int numberOfBits) {
ulong block =
((ulong) array[(startByte+4) % array.Length] << 32)
| ((ulong) array[(startByte+3) % array.Length] << 24)
| ((ulong) array[(startByte+2) % array.Length] << 16)
| ((ulong) array[(startByte+1) % array.Length] << 8)
| (ulong) array[startByte];
return (uint) ((block >> startBit) & ~(ulong.MaxValue << numberOfBits));
}由于uint为32位,因此numberOfBits必须为≤32。
示例:
extract32(new byte[] {0x10, 0x32, 0x54, 0x76, 0x98, 0xBA}, 1, 4, 32);提取0xA9876543。
https://stackoverflow.com/questions/68657072
复制相似问题