gpt4 book ai didi

Java:如何创建一个方法来使用掩码从字节数组中提取整数的分割位

转载 作者:太空宇宙 更新时间:2023-11-04 08:51:41 24 4
gpt4 key购买 nike

在解码一些视频流标准时,我注意到很多情况下,整数值的位以 2-6 个字节的任何形式提供,但由保留位分隔,如下所示:

// Specification (16 bits)
// -----------------------
// Reserved 1 bit
// Value A [6-7] 2 bit
// Reserved 2 bit
// Value A [4-5] 2 bit
// Reserved 3 bit
// Value A [0-3] 4 bit
// Reserved 2 bit

例如,值 185(101110010xB9)将按如下方式存储在两个字节数组中:

01000110 00100100

我知道这很疯狂,但这就是这些人编码数据流的方式。可以使用以下位运算来提取

int w = 0;
w |= (0x60 & data[0]) >>> 5; // extract the first 2 bits shifted to the front
w <<= 2; // bump them up 2 bits for the next section
w |= (0x06 & data[0]) >>> 1; // extract the next 2 bits shifted to the front
w <<= 4; // bump them up 4 bits for the last section
w |= (0x3C & data[0]) >>> 2; // extract the last 4 bits shifted to the front

// w now will equal 10111001 (185)

我希望能够做的是创建一个方法,该方法接受未确定长度的字节数组和一个表示位掩码的 Int,这些位构成我们试图从提供的规范中提取的值。像这样的事情

public static void testMethod() {

byte[] data = new byte[] {0x46, 0x24}; // 01000110 00100100
int mask = 0x663C; // 01100110 00111100
int x = readIntFromMaskedBytes(data, mask);

}

public static int readIntFromMaskedBytes(byte[] data, int mask) {
int result = 0;

// use the mask to extract the marks bits from each
// byte and shift them appropriately to form an int

return result;
}

我已经使用原始的“手动”方法完成了我正在从事的项目,但由于这些事件的数量之多及其复杂性,我对它的干净程度不满意。我很想提出一种更通用的方法来完成同样的事情。

不幸的是,当涉及到这种复杂的位移位时,我仍然是一个新手,我希望有人能够提供一些关于如何最好地实现这一点的建议或建议。

谢拉

注意 - 请原谅上面伪代码中的任何语法错误,它只是为了解释用例而设计的。

最佳答案

实际上,我倾向于认为内联掩码和移位方法(如果比伪代码实现得更干净一点)比尝试编写通用方法更好。对于经验丰富的低级位攻击代码开发人员来说,阅读掩码和移位代码应该不成问题。您所提议的通用方法的问题在于,它将显着降低效率......并且 JIT 编译器难以优化。

顺便说一句,这就是我编写代码的方式。

// extract and assemble xxxx from yyyy 
int w = ((0x003C & data[0]) >> 2) |
((0x0600 & data[0]) >> 6) |
((0x6000 & data[0]) >> 7);

编辑

I would still like to understand how such a generic approach could be coded though, as a learning exercise.

类似这样的事情:

public static int readIntFromMaskedBytes(int data, int mask) {
int result = 0;
int shift = 0;
while (mask != 0) {
if (mask & 1) {
result |= (data & 1) << shift++;
}
data >>>= 1;
mask >>>= 1;
}
}

如您所见,最多需要 32 次循环迭代才能给出答案。对于您的示例,我认为这种方法比原始版本大约慢 10 倍。

关于Java:如何创建一个方法来使用掩码从字节数组中提取整数的分割位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3176705/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com