ここから本文です

解決済みのQ&A

UNIXコマンドでバイナリデータの編集は可能か?

hafezalaqsaさん

UNIXコマンドでバイナリデータの編集は可能か?

UNIXコマンドでバイナリデータの編集は可能でしょうか?
例えば、以下の様な10バイト固定長のデータの2バイト目から4バイトを切り出して改行をつけて、HEX表示させることは可能でしょうか?

[編集前]
x31x00x00x00x01x36x37x38x09x0a
x31x00x00x00x02x36x37x38x09x0a
x31x00x00x00x03x36x37x38x09x0a

※上記は便宜上16進表記し、境界が分かりやすい様に10バイトで改行表示している。

[編集後]
00000001[改行]
00000002[改行]
00000003[改行]

お手数ですが、どなたかご教示願います。

補足
補足:
HEX表示ではなく、HEX形式文字列表示の誤りでした。
  • 質問日時:
    2011/8/24 22:16:47
  • 解決日時:
    2011/8/26 00:57:31
  • 閲覧数:
    2,125
    回答数:
    2
  • お礼:
    知恵コイン
    100枚

ベストアンサーに選ばれた回答

ycos001さん

編集という事ですが、バイナリデータのフォーマット出力ですね。
テキストデータで区切り記号がれあば cut を使うところですが、バイナリなので、私の知る限りコマンド一発での出力は難しいです。
(単に位置を指定して取り出すのであれば -b オプションが使えます)
perl で簡単なプログラムを作る事でよいいなら、対策はあります。
前提を置くためにデータ作成プログラムも用意しました。ご参考まで。

--- 表示用 int.pl
#! /usr/bin/perl
open(IFILE, "< data.dat") || die "Can't open data.dat";
binmode IFILE;

while( !eof(IFILE) ){
read(IFILE, $data, 10);
($d1, $d2, $d) = unpack("CIC5",$data);
printf("%08x\n", $d2);
}
close(IFILE);

--- データ作成用 bin.pl
#! /usr/bin/perl
open(WFILE, "> data.dat") || die "Can't open data.dat";
binmode WFILE;

for($i=268435450;$i<268435460 ;$i++){
$data = pack("CIC5", 0x31, $i, 0x36, 0x37, 0x38, 0x09, 0x0a);
print WFILE $data;
}
close(WFILE);

質問した人からのお礼

  • 驚くycos001さん
    コマンド一発だと難しいですけど、perl使ってワンライナーで出来ました。気づかなかった!!
    fold -b -w10 ./binary | perl -ne 'printf("%s\n",unpack("H*",substr($_,1,4)));'

    dolphin960413さん
    有難うございました。viのバイナリ編集の仕方ですね。その節はどうも有難うございました。

    BAは、perl使用の着想を気づかせてくれたycos001さんにしたいと思います。
    皆さん有難うございました。
  • コメント日時:2011/8/26 00:57:31

グレード

ベストアンサー以外の回答

(1件中1〜1件)

 

dolphin960413さん

エディタ vi(vim) でバイナリデータの編集も可能です。

以下の Q&A を参照してください。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1469594839

[参考記事]
Linux Tips: vi(vim) 入門
http://www.dolphin-bbs.net/linuxtips/vimintro.html

Q&Aをキーワードで検索:

総合Q&Aランキング

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。

知恵コレに追加する

閉じる

知恵コレクションをするID/ニックネームを選択し、「追加する」ボタンを押してください。
※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。

ほかのID/ニックネームで利用登録する