2014-06-07 2 views
0

R에서는 바이너리 데이터를 정수 값으로 변환하려고하지만 1 값으로 저장되는 대신 1 바이트에 여러 값이 바이트 단위로 저장됩니다.바이너리에서 8 비트 미만의 정수 읽기 R

64 비트 (8 바이트)에 걸쳐 12 개의 정수 값이 저장된다는 것을 알고 있습니다. 다음 코드 후 5,6,5,5,4,7,5,6,5,5,4,7 :

time <- readBin(fid,integer(),size=1,n=8,signed='FALSE')

는 반환이 12 개 정수는 다음의 비트 수를 가지고 : [1] 25 156 113 63 214 158 113 63

올바른 데이터가 있어야한다 : 25 32 19 17 11 31 22 54 19 17 11 31

내가 BITAND 및 bitShiftL (패키지 bitops)를 사용하여 시도,하지만 진정한 성공이 없었습니다. 그리고 도움이 크게 감사하겠습니다.

+1

5 비트 만 차지하면 두 번째 값은 32가 될 수 있습니까? –

+0

좋은 캐치 (두 자리 숫자가 잘못된 순서 임). 이제 비트 수는 정확합니다. – habd

답변

2

각 4 바이트 정수에서의 연산은 동일합니다 (패턴이 두 번 반복됨). 따라서 4 바이트 정수의 문제를 해결하고 파일의 4 바이트 정수를 반복하면됩니다 (readBin을 통해 검색). 문제를 바이트 단위로 생각하는 것보다 훨씬 간단합니다.

# length(x) should be 1 
bitint <- function(x, bitlens) { 
    result <- integer(length(bitlens)) 
    for (i in seq_along(bitlens)) { 
    result[i] <- bitwAnd(x, (2^bitlens[i])-1) 
    x <- bitwShiftR(x, bitlens[i]) 
    } 
    return(result) 
} 

bitlens <- c(5,6,5,5,4,7) 
x <- c(1064410137L, 1064410838L) 
c(sapply(x, function(i) bitint(i, bitlens))) 
## [1] 25 32 19 17 11 31 22 54 19 17 11 31 
+0

이것은 매우 잘 작동합니다. 4 바이트 정수를 가져 오는 것이 좋습니다. 고맙습니다! – habd

1

표준 데이터 읽기 기본 기능 (예 : 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 

예상 한 값을 얻기 위해 약간의 비트 길이를 변경해야한다는 점에 유의하십시오. 예상되는 출력이 맞는지 또는 비트 길이가 올바른지 다시 확인하고 싶을 수 있습니다.