如何从32位R整数中提取4位无符号整数



我正在读取R中的二进制文件,需要读取10个字节,这些字节必须解释为4位无符号整数(每个字节2个,所以我想范围为0..15的20个值(。

根据我对文档的理解,这不能直接用readBin来完成,因为读取的最小长度1意味着1字节

因此,我认为我需要将数据读取为1字节整数,并使用逐位运算来获得4位整数。我发现这些值是由R内部存储为32位整数的,我在SO上发现了这个解释,它似乎描述了我想做的事情

#' @title Interprete bits start_index to stop_index of input int8 as unsigned integer.
uint8bits <- function(int8, start_index, stop_index) {
num_bits = stop_index - start_index + 1L;
bitmask = bitwShiftL((bitwShiftL(1L, num_bits) -1L), stop_index);
return(bitwShiftR(bitwAnd(int8, bitmask), start_index));
}

然而,它并没有按预期工作,例如,从读取值中取出两个数字(本例中为255(,我会调用该函数一次以提取位1至4,再次调用位5至8:

value1 = uint8bits(255L, 1, 4); # I would expect 15, but the output is 120.
value2 = uint8bits(255L, 5, 8); # I would expect 15, but the output is 0.

我做错了什么?

我们可以使用packBits函数来实现您的预期行为:

uint8.to.uint4 <- function(int8,start_index,stop_index)
{
bits <- intToBits(int8)
out <- packBits(c(bits[start_index:stop_index],
rep(as.raw(0),32-(stop_index-start_index+1))),type="integer")
return(out)
}
uint8.to.uint4(255L,1,4)
[1] 15

我们首先将integer转换为位向量,然后提取您喜欢的位,并用0填充数字,以实现整数(32位(的32位内部存储长度。然后我们可以用packBits函数转换回integer

最新更新