documents:proglang:perl:perl-0002
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン | |||
| documents:proglang:perl:perl-0002 [2026/05/08 11:54] – ↷ documents:perl:perl-0002 から documents:proglang:perl:perl-0002 へページを移動しました。 k896951 | documents:proglang:perl:perl-0002 [2026/05/17 15:00] (現在) – [Perlでバイナリファイルを読むサンプルコード] k896951 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | ====== 005.Perlでバイナリファイルを読むサンプルコード ====== | ||
| + | |||
| + | 2009年09月02日 13時15分13秒 | ||
| + | |||
| + | 「読む例は~?」のツッコミがメールで今頃入ったのでどうかと思ったけど記述。 | ||
| + | |||
| + | ===== ソース ===== | ||
| + | |||
| + | |||
| + | <code perl s2.pl> | ||
| + | ## バイナリファイルを読み込んで16進数の文字列で書き出すサンプル | ||
| + | |||
| + | binmode(STDIN); | ||
| + | $cnt = 0; | ||
| + | $addr = 0; | ||
| + | while(1==1) { | ||
| + | printf(" | ||
| + | |||
| + | last if undef == read(STDIN, $code, 1); | ||
| + | printf(" | ||
| + | $cnt++; | ||
| + | |||
| + | if (16==$cnt) { | ||
| + | print " | ||
| + | $addr+=$cnt; | ||
| + | $cnt=0; | ||
| + | } | ||
| + | } | ||
| + | print "\n--- end\n"; | ||
| + | </ | ||
| + | |||
| + | 標準入出力を使うことを想定した。 | ||
| + | 16進ダンププログラム風。 | ||
| + | |||
| + | 突っ込み対応。長さゼロのファイルの時はアドレス表示も出ません。 | ||
| + | |||
| + | <code perl s2a.pl> | ||
| + | ## バイナリファイルを読み込んで16進数の文字列で書き出すサンプル | ||
| + | |||
| + | binmode(STDIN); | ||
| + | $cnt = 0; | ||
| + | $addr = 0; | ||
| + | while(1==1) { | ||
| + | last if undef == read(STDIN, $code, 1); | ||
| + | |||
| + | printf(" | ||
| + | printf(" | ||
| + | $cnt++; | ||
| + | |||
| + | if (16==$cnt) { | ||
| + | print " | ||
| + | $addr+=$cnt; | ||
| + | $cnt=0; | ||
| + | } | ||
| + | } | ||
| + | print "\n--- end\n"; | ||
| + | </ | ||
| + | |||
| + | 好きなほうをどうぞ。個人的にはアドレスが出ててデータが無い行があっても全然構いませんです。 | ||
| + | |||
| + | ===== 入力データ ===== | ||
| + | |||
| + | |||
| + | <code txt input.txt> | ||
| + |  ̄~ ̄; | ||
| + | </ | ||
| + | |||
| + | いわゆるCP932(SJIS)の文字を5個並べた。 | ||
| + | |||
| + | ===== 実行結果 ===== | ||
| + | |||
| + | |||
| + | < | ||
| + | f: | ||
| + |  ̄~ ̄; | ||
| + | f: | ||
| + | 00000000 81 40 81 50 81 60 81 50 81 47 | ||
| + | --- end | ||
| + | |||
| + | f:\work> | ||
| + | </ | ||
| + | |||
| + | ===== 説明 ===== | ||
| + | |||
| + | 標準入力をバイナリモードにするため binmode()でSTDINを指定した。 | ||
| + | 次に標準入力から1バイトずつ読み、それを unpack()で“1文字”に変換する。あとは printf()の書式で %02X を指定し16進数2桁で表示。 | ||
| + | ※2バイトのコードの上位・下位バイトを各々長さ1バイトの文字として編集した | ||
| + | |||
| + | ===== 旧ページコメント ===== | ||
| + | |||
| + | * ふむふむ。16バイトきっちりのときは、アドレスだけの行が出力されるんですね?(^ ^; - JK (2009年08月31日 22時17分13秒) | ||
| + | * 意味がやっとわかった。答えはYES。問題なし。とりあえずその突っ込みようの解答は書いておきますね。 - 努力中の人 (2009年09月01日 07時17分32秒) | ||
| + | * 2種類掲載したかwてか、個人的には、ループそのものは無限ループ形式で、ループの中で意図的に外にジャンプしないとならない作りはwま、いっかww - JK (2009年09月02日 13時15分13秒) | ||
| + | |||
| + | {{tag> | ||
documents/proglang/perl/perl-0002.txt · 最終更新: by k896951
