![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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すればよいかと。
![「ruby バイナリ入出力について」の回答画像2](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/3/64512_5497ee5c2b5c6/M.jpg)
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- その他(プログラミング・Web制作) Pythonを勉強しています。 5 2023/08/25 09:51
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- その他(プログラミング・Web制作) Python - Excel で Webからデータを連続取得したいのですが エラーが出ます 1 2023/07/06 20:08
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フィルターかけた後、重複を除...
-
IF文、条件分岐の整理方法
-
Exel VBA 別ブックから該当デ...
-
1日に1人がこなせるプログラム...
-
access2003 クエリSQL文に...
-
JANコードとPOSコードは同じ?
-
sinカーブの表示のさせ方
-
COBOLの文法
-
文字列を検索しその列をコピー...
-
SQL
-
【VB6】実行ファイルとした後、...
-
JIPS-Eコードのコード表について
-
JavaScriptの定数名が取り消し...
-
ACCESSで、履歴事項を管理する...
-
コンボボックスの複数列表示に...
-
◾️Excel VBA 統合について Cons...
-
EXCEL VBA 最初だけ0という値を...
-
ExcelVBAで「Shift_JIS(MS932)...
-
CheckBoxのコントロール配列に...
-
C# コードビハインドについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フィルターかけた後、重複を除...
-
1、Rstudioで回帰直線を求める...
-
1日に1人がこなせるプログラム...
-
access2003 クエリSQL文に...
-
エクセルVBAコードで教えて下さ...
-
Exel VBA 別ブックから該当デ...
-
JavaScriptの定数名が取り消し...
-
COBOLの文法
-
access2021 VBA メソッドまたは...
-
PreviewKeyDownイベントが2回...
-
JANコードとPOSコードは同じ?
-
過剰なオブジェクト指向脳から...
-
特定行の背景色を変えたいのですが
-
ACCESSユニオンクエリでORDER B...
-
変数名「cur」について
-
Nullの使い方が不正です。
-
◾️Excel VBA 統合について Cons...
-
欠番の抽出について
-
VBA リストボックス(複数条件...
-
ACCESSで、履歴事項を管理する...
おすすめ情報