Rのデータ構造をバイナリにしたいと思って、Rinternals.hをのぞく。このヘッダーファイルをのぞいている日でろくな日はない気が(ry。
コーディングしていたら、3時くらいになっていて、次の日朝から授業ということを忘れていた。お腹減ったと思って、カップラーメン食べてる場合ではなかった。
以下、自分用メモ。
- charToRawとかで文字列を16ビットのバイナリに変換
- rawShift => Rでbit shiftするための関数?
- helpのを見ると、1が右左にshiftしている様子が分かりやすくなっていてよい。こんな感じ
- 計算機システム概論もRで勉強すべきだったか...
- helpのを見ると、1が右左にshiftしている様子が分かりやすくなっていてよい。こんな感じ
> showBits <- function(r) stats::symnum(as.logical(rawToBits(r))) > z <- as.raw(5) > z ; showBits(z) [1] 05 [1] | . | . . . . . > showBits(rawShift(z, 1)) # shift to right [1] . | . | . . . . > showBits(rawShift(z, 2)) [1] . . | . | . . . > showBits(z) [1] | . | . . . . . > showBits(rawShift(z, -1)) # shift to left [1] . | . . . . . . > showBits(rawShift(z, -2)) # .. [1] | . . . . . . . > showBits(rawShift(z, -3)) # shifted off entirely [1] . . . . . . . .
うーん、自分でCを頑張らなくってもR側でバイナリのベクトルに変換できるっぽいじゃないか。。。バイナリにしたいオブジェクトがvectorとかに限定されず、functionのようなオブジェクトもシリアライズできるようだ。ということで、rawが入っているvectorに限定して、putとかgetとかできるようにしておけばよい...だろうか。
> x <- serialize(list(1,2,3), NULL) > x [1] 58 0a 00 00 00 02 00 02 0b 00 00 02 03 00 00 00 00 13 00 00 00 03 00 00 00 [26] 0e 00 00 00 01 3f f0 00 00 00 00 00 00 00 00 00 0e 00 00 00 01 40 00 00 00 [51] 00 00 00 00 00 00 00 0e 00 00 00 01 40 08 00 00 00 00 00 00 > unserialize(x) [[1]] [1] 1 [[2]] [1] 2 [[3]] [1] 3 > serialize(function(x) x, NULL) [1] 58 0a 00 00 00 02 00 02 0b 00 00 02 03 00 00 00 06 03 00 00 04 02 00 00 00 [26] 01 00 00 00 09 00 00 00 06 73 6f 75 72 63 65 00 00 00 10 00 00 00 01 00 00 [51] 00 09 00 00 00 0d 66 75 6e 63 74 69 6f 6e 28 78 29 20 78 00 00 00 fe 00 00 [76] 00 fd 00 00 04 02 00 00 00 01 00 00 00 09 00 00 00 01 78 00 00 00 fb 00 00 [101] 00 fe 00 00 02 ff
serialize関数とかは普通のRのユーザーレベルだとload関数とかsave関数とかが(きっと)使っている関数じゃないんですかね。