8bit*3ずつ読んで、6bit*4ずつ書くというアルゴリズムらしい。Rにも文字列 <-> バイナリーの関数はあるのだけど、ビットの内部表現がリトルエンディアン(?)なので非常にみにくい。
> base64.table <- c(LETTERS, letters, c("+", "/")) > charToRaw("A") [1] 41 > rawToBits(charToRaw("A")) [1] 01 00 00 00 00 00 01 00 > rawToBits(charToRaw("AB")) [1] 01 00 00 00 00 00 01 00 00 01 00 00 00 00 01 00
それはいいんだけど、Base64エンコードはビッグエンディアンで並べた後上位から6ビットずつ取っていくので、Rで同じことをやるにはそれぞれ反転させないといけない。うーんどうしよう。
base64.table <- c(LETTERS, letters, c("+", "/")) str <- "ABCD" r <- charToRaw(str) r1 <- r[1:3] b <- as.vector(sapply(r1, function(r){rev(rawToBits(r))})) b2 <- c(as.raw(c(0,0)), b[1:6]) as.integer(packBits(rev(b2))) base64.table[i+1] # Rの配列は1からはじまる [1] "Q"
ここでは愚直に1セットずつ取ってるけど、実際はマトリックスを作って(8x3) -> (6x4)みたいにして、applyで一括変換でしょう。とはいえ、なんにしてもめんどくさいことはめんどくさいな・・・。むむ。
てゆーかnkf使えばいいんだけどさ。Pure Rじゃなくなっちゃうしなあ。そもそもRには荷が重過ぎる問題だ。