Base64 for R

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には荷が重過ぎる問題だ。