プロが教えるわが家の防犯対策術!

ruby初心者です。

バイナリファイルを読み込んで、その値を2倍して再びバイナリファイルに書き込む
ソースを作りたいのですが、どなたかご教示願えますでしょうか。


以下試行錯誤して作ってみたのですが、このソースだと
例えば31というバイナリデータが62で書かれず、
36、32のasciiコードで保存されてしまいます。。

-----------------------------
BinData = open("in.data")
BinData.binmode

File.open("out.data", "wb"){|f|

while (b = BinData.read(1))
m = b.unpack('C')[0]*2     #取り込んだバイナリデータを整数化して2倍
p sprintf("%x", m)
k = format("%x", m)       #16進数に変換
f.write(k)
end
}

すみませんが宜しくお願い致します。

A 回答 (2件)

unpackしてるのだから、packすればよいかと。

「ruby バイナリ入出力について」の回答画像2
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

ソースを参考にさせて頂きます。

お礼日時:2012/08/19 09:05

> k = format("%x", m)       #16進数に変換



これは、 「16進数として**人間が読めるようにした**文字列」になります。
m=31*2=62が入ったのなら
62=0x3e より
k="3e"
k.unpack("CC") # => [51,101]

なので
> 36、32のasciiコードで保存されてしまいます
というのも変です。


バイナリデータは 0x3、0x1 の2バイト
0x3→(2倍)→0x6→(format '%x')→ '6' →(ASCIIコード)→ 0x36
0x1→(2倍)→0x2→(format '%x')→ '2' →(ASCIIコード)→ 0x32
あるいは
バイナリデータは 0x31 の1バイト
0x31→(2倍)→0x62→(format '%x')→ '62' →(ASCIIコード)→ 0x36 0x32
なら理屈があいます。
# こちらの意味で使っているのなら、0xを付けるなど、16進表記だと明記してください。

chrメソッド、pack、format("%c")といったものが解決策になります。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

説明不足ですみません。

ただ解決策にあります、format("%x", m) をformat("%c", m)
にすることで目的としては達成しました。

丁寧に説明して頂きありがとうございました。

お礼日時:2012/08/18 15:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!