표준 데이터 읽기 기본 기능 (예 : redBin
과 같은 기능은 한 번에 한 바이트 이상을 선호하는 것처럼 보입니다.)을 사용하여이 작업을 수행하는 방법을 잘 모릅니다. 그래서 바이트에서 비트를 추출하여 숫자로 바꾸는 지저분한 계산을 수행하는 함수를 만들었습니다. 나는 여기에 기능
bitints <- function(bytes, bitlengths) {
stopifnot(sum(bitlengths) <= 8*length(bytes))
stopifnot(all(bitlengths <= 8))
bytebits <- rep.int(8, length(bytes))
masks <- c(1L,3L,7L,15L,31L,63L,127L, 255L)
outs <- numeric(length(bitlengths))
for(i in seq_along(bitlengths)) {
need <- bitlengths[i]
got <- 0
r <- 0
while(need>0) {
j <- which(bytebits>0)[1]
bitget <- min(need, bytebits[j])
r <- r + bitwShiftL(bitwAnd(bytes[j],masks[bitget]), got)
bytebits[j] = bytebits[j]-bitget
bytes[j] = bitwShiftR(bytes[j], bitget)
need <- need - bitget
got <- got + bitget
}
outs[i] <- r
}
outs
}
당신은 당신이 필요로하는 값을 얻을 바이트 값의 배열 및 비트 크기의 배열을 전달이다 (?bitwAnd
참조) 기본 R의 비트 연산자를 사용하게했다. 다음은 데이터를 사용하는 예입니다.
bytes <- c(25L, 156L, 113L, 63L, 214L, 158L, 113L, 63L)
bitlens <- c(5,6,5,5,4,7,5,6,5,5,4,7)
bitints(bytes, c(5,6,5,5,4,7,5,6,5,5,4,7))
# [1] 25 32 19 17 11 31 22 54 19 17 11 31
예상 한 값을 얻기 위해 약간의 비트 길이를 변경해야한다는 점에 유의하십시오. 예상되는 출력이 맞는지 또는 비트 길이가 올바른지 다시 확인하고 싶을 수 있습니다.
5 비트 만 차지하면 두 번째 값은 32가 될 수 있습니까? –
좋은 캐치 (두 자리 숫자가 잘못된 순서 임). 이제 비트 수는 정확합니다. – habd