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倍になっているので、多分ビットの取り扱いなんだろうけど。まあ同じだからいいかという感じ。