r - 如何从 32 位 R 整数中提取 4 位无符号整数?
问题描述
我正在读取 R 中的二进制文件,需要读取 10 个字节,它必须被解释为 4 位无符号整数(每个字节 2 个,所以我猜有 20 个值在 0..15 范围内)。
根据我对文档的理解,这不能readBin
直接完成,因为要读取的最小长度 1 表示1 byte。
所以我认为我需要将数据读取为 1 字节整数并使用按位运算来获取 4 位整数。我发现这些值在 R 内部存储为 32 位整数,我发现这个关于 SO 的解释似乎描述了我想要做的事情。所以这是我对遵循建议的 R 函数的尝试:
#' @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
推荐阅读
- max-msp-jitter - 使用 Max / Jitter 在 2D 中模拟重力
- markdown - 在代码块中启用包装(vuepress)
- matlab - Matlab中如何连接一行和一列
- firebase - 如何从 Google Cloud Storage 中删除 180 天以上的文件?
- python - Keras:预期dense_input有3维,但得到了形状为(x,y)的数组
- image - 脏图像质量评估措施
- regex - 在之间或之后/之前捕获最后一个元素?
- tensorflow - Tensorflow - HuggingFace - 无效参数:indices[0,624] = 624 不在 [0, 512)
- android - java.io.FileNotFoundException:/storage/3766-6230/MyData/smallv.mp4(权限被拒绝)
- android - Android (AOSP) 7:在其他模块之前构建模块/修补模块作为构建过程的一部分/修改系统源