
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件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
unpackしてるのだから、packすればよいかと。

No.1
- 回答日時:
> 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")といったものが解決策になります。
ご回答ありがとうございます。
説明不足ですみません。
ただ解決策にあります、format("%x", m) をformat("%c", m)
にすることで目的としては達成しました。
丁寧に説明して頂きありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
1日に1人がこなせるプログラム...
-
access2003 クエリSQL文に...
-
フィルターかけた後、重複を除...
-
JANコードとPOSコードは同じ?
-
access2021 VBA メソッドまたは...
-
ActiveReportの改ページ不具合...
-
特定行の背景色を変えたいのですが
-
JIPS-Eコードのコード表について
-
COBOLの文法
-
レポートでグループレベルの変...
-
access でエラーを回避するには?
-
VBAでファイルオープン後にコー...
-
pythonで同じコード内で複数の...
-
JavaScriptの定数名が取り消し...
-
ピクチャーボックス内の三角形...
-
Exel VBA 別ブックから該当デ...
-
PreviewKeyDownイベントが2回...
-
VBAでdo内にてWAITを使うとエラ...
-
1、Rstudioで回帰直線を求める...
-
ExcelVBAの転記について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フィルターかけた後、重複を除...
-
1、Rstudioで回帰直線を求める...
-
access2021 VBA メソッドまたは...
-
1日に1人がこなせるプログラム...
-
JANコードとPOSコードは同じ?
-
エクセルに見えない文字(JISX0...
-
変数名「cur」について
-
access2003 クエリSQL文に...
-
Excelシート上で右クリックがで...
-
【VB6】実行ファイルとした後、...
-
COBOLの文法
-
Exel VBA 別ブックから該当デ...
-
JavaScriptの定数名が取り消し...
-
C# コードビハインドについて
-
JIPS-Eコードのコード表について
-
Nullの使い方が不正です。
-
PreviewKeyDownイベントが2回...
-
VBAでファイルオープン後にコー...
-
ユーザーフォームに2つのコン...
-
ACCESSユニオンクエリでORDER B...
おすすめ情報