うーんなんでだろ

ようやくbase64エンコーディングができました。

base64.table <- c(LETTERS, letters, unlist(strsplit("0123456789+/", "")))
tobase64 <- function(str){
    r   <- charToRaw(str)
    paddings <- (3-length(r))%%3
    r1  <- c(r, as.raw(rep(0, paddings)))
    m   <- matrix(r1, 3, length(r1)/3)
    b64 <- as.vector(apply(m, 2, tobase64.each8bit))
    if(paddings == 2) b64[length(b64)-1] = "="
    if(paddings == 2 || paddings == 1) b64[length(b64)] = "="
    return(paste(b64,collapse=""))
}
tobase64.each8bit <- function(m){
    b1 <- as.vector(sapply(m, function(a){rev(rawToBits(a))}))
    b2 <- rbind(matrix(as.raw(0), 2,4), matrix(b1, 6, 4))
    apply(b2, 2, tobase64.each6bit)
}
tobase64.each6bit <- function(b){
    return(base64.table[as.integer(packBits(rev(b)))+1])
}

ただ、実行してみるとnkfと結果が違うんだよな・・・。

> tobase64("どう書く")
[1] "gseCpI+Rgq0="
$ echo -n どう書く | nkf -MB
GyRCJEkkJj1xJC8bKEI=

でもデコードは両方うまく行く。何でだろ!ふしぎ!

$ echo -n "gseCpI+Rgq0=" | nkf -mB
どう書く

$ echo -n "GyRCJEkkJj1xJC8bKEI=" | nkf -mB
どう書く

幅が2倍になっているので、多分ビットの取り扱いなんだろうけど。まあ同じだからいいかという感じ。