C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[32]: バイナリコード内の16進数での文字列検索 [2]


(過去ログ 52 を表示中)

[トピック内 72 記事 (41 - 60 表示)]  << 0 | 1 | 2 | 3 >>

■28628 / inTopicNo.41)  Re[12]: バイナリコード内の16進数での文字列検索
  
□投稿者/ たくボン (84回)-(2008/11/28(Fri) 12:26:01)
No28614 (επιστημη さん) に返信
> 2008/11/28(Fri) 10:39:39 編集(投稿者)
> # ぶっちゃけ printf("%02X"...) の方がはるかに楽っす ^^;

確かにw
マニピュレータは便利ですけど、C++なんだから使えるものは使った方がいいかも。
ってか、GUIを伴わないファイル操作だけならCでも十分な気が・・・w
引用返信 編集キー/
■28631 / inTopicNo.42)  Re[13]: バイナリコード内の16進数での文字列検索
□投稿者/ επιστημη (1384回)-(2008/11/28(Fri) 12:49:10)
επιστημη さんの Web サイト
> マニピュレータは便利ですけど、C++なんだから使えるものは使った方がいいかも。

C++はCを包含できるんだから便利なもんはちゃっちゃと使わせていただくのもアリですけどね。

> ってか、GUIを伴わないファイル操作だけならCでも十分な気が・・・w

んでも No28627 をCで実装するとなると結構ホネよ♪

引用返信 編集キー/
■28641 / inTopicNo.43)  Re[10]: バイナリコード内の16進数での文字列検索
□投稿者/ επιστημη (1385回)-(2008/11/28(Fri) 13:29:55)
επιστημη さんの Web サイト
> ファイルの内容を最初に全部読みこんじゃってもいいけど
> より汎用的に作るには、読みこみながら探す方が良く
> それだと search は使えないですね。

まるっと読んだら負けかなと思ってみるテスト:

#include <sstream>
#include <iomanip>
#include <deque>
#include <iterator>
#include <algorithm>

template<typename InputIterator1, 
         typename InputIterator2, 
         typename InputIterator3, 
         typename OutputIterator>
OutputIterator replace_s(InputIterator1 first, InputIterator1 last, 
                       InputIterator2 pattern_first, InputIterator2 pattern_last,
                       InputIterator3 replace_first, InputIterator3 replace_last,
                       OutputIterator out) {
  std::deque<std::iterator_traits<InputIterator1>::value_type>::size_type pattern_size 
    = std::distance(pattern_first, pattern_last);
  std::deque<std::iterator_traits<InputIterator1>::value_type> que;
  for ( ; first != last; ++first ) {
    que.push_back(*first);
    if ( que.size() > pattern_size ) {
      *out++ = que.front();
      que.pop_front();
    }
    if ( que.size() == pattern_size && std::equal(pattern_first, pattern_last, que.begin()) ) {
      out = std::copy(replace_first, replace_last, out);
      que.clear();
    }
  }
  return std::copy(que.begin(), que.end(), out);
}

/* おためし:

  このソース自身を標準入力に食わせ、
   "InputIterator" を "入力イテレータ"
   に置換してみよぉ!
*/

#include <iostream>

int main() {
  std::istreambuf_iterator<char> first(std::cin);
  std::istreambuf_iterator<char> last;
  
  std::string pattern = "InputIterator";
  std::string replace = "入力イテレータ";
  replace_s(first,           last, 
            pattern.begin(), pattern.end(), 
            replace.begin(), replace.end(), 
            std::ostream_iterator<char>(std::cout));
}

引用返信 編集キー/
■28650 / inTopicNo.44)  Re[11]: バイナリコード内の16進数での文字列検索
□投稿者/ .SHO (226回)-(2008/11/28(Fri) 15:18:34)
No28641 (επιστημη さん) に返信

> まるっと読んだら負けかなと思ってみるテスト:

せっかく沢山コード書いて頂いてるのですが、C言語なら
20年コーディングしてるんで、絶対に負けない自信はあるのですが
C++では勝てません。。。
引用返信 編集キー/
■28652 / inTopicNo.45)  Re[12]: バイナリコード内の16進数での文字列検索
□投稿者/ επιστημη (1386回)-(2008/11/28(Fri) 15:29:56)
επιστημη さんの Web サイト
> C言語なら20年コーディングしてるんで、絶対に負けない自信はあるのですが

まるっと読まない版のC実装お披露目きぼーん。

引用返信 編集キー/
■28654 / inTopicNo.46)  Re[13]: バイナリコード内の16進数での文字列検索
□投稿者/ .SHO (227回)-(2008/11/28(Fri) 15:32:06)
No28652 (επιστημη さん) に返信

> まるっと読まない版のC実装お披露目きぼーん。

いいですよ!(笑)
って答えでのいいのかしら?www
引用返信 編集キー/
■28655 / inTopicNo.47)  Re[14]: バイナリコード内の16進数での文字列検索
□投稿者/ .SHO (228回)-(2008/11/28(Fri) 15:34:06)
No28654 (.SHO さん) に返信

あっ!違うか…僕に書けと言ってるわけですね。
まるっと読めないC++版の真意が良くわかってないので
書けないっす^^;
引用返信 編集キー/
■28656 / inTopicNo.48)  Re[15]: バイナリコード内の16進数での文字列検索
□投稿者/ .SHO (229回)-(2008/11/28(Fri) 15:34:56)
「読めない」じゃなくて「読まない」だし…
引用返信 編集キー/
■28660 / inTopicNo.49)  Re[15]: バイナリコード内の16進数での文字列検索
□投稿者/ επιστημη (1387回)-(2008/11/28(Fri) 15:52:15)
επιστημη さんの Web サイト
> まるっと読めないC++版の真意が良くわかってないので
> 書けないっす^^;

「ストリームなりなんなりからちょびっとずつ読み出し、
pattern[N]と一致するとこだけreplace[M]に置き換えて出力する」

です。

僕が書いたヤツはpattern[N]との比較のため、
N文字分のバッファ(FIFO)を用意しそこに読み出してます。
速いアルゴリズムはいっくらでもありそうなんだけど、
ファイルが相手ならそんなにがんばっても意味ねぇし ^^;


引用返信 編集キー/
■28661 / inTopicNo.50)  Re[16]: バイナリコード内の16進数での文字列検索
□投稿者/ .SHO (230回)-(2008/11/28(Fri) 16:02:08)
No28660 (επιστημη さん) に返信

> 「ストリームなりなんなりからちょびっとずつ読み出し、
> pattern[N]と一致するとこだけreplace[M]に置き換えて出力する」
>
> です。

そういうことですね。
これ、簡単そうで何気に面倒なんですよね。

脱線しますが、CSVファイルの読み込みを自作するのも
簡単そうで何気に難しい。。。
引用返信 編集キー/
■28663 / inTopicNo.51)  Re[17]: バイナリコード内の16進数での文字列検索
□投稿者/ επιστημη (1388回)-(2008/11/28(Fri) 16:10:47)
επιστημη さんの Web サイト
> これ、簡単そうで何気に面倒なんですよね。

うん。C++ならライブラリの手駒が揃ってるからこの程度で書けるけども、
<string.h> と <stdio.h> くらいしか手駒のないCだとどぉなるのか興味津々。
なので20年間培ったCの技芸を拝見したく。

引用返信 編集キー/
■28664 / inTopicNo.52)  Re[18]: バイナリコード内の16進数での文字列検索
□投稿者/ .SHO (231回)-(2008/11/28(Fri) 16:21:23)
No28663 (επιστημη さん) に返信

> なので20年間培ったCの技芸を拝見したく。

できました。
ファイル名は質問者さんに敬意を表して"A.hoge"にし
「C++」を「しーぷらすぷらす」に変換して標準出力に吐き出す。
fopenのエラーチェックは省略。

#include <stdio.h>

void main() {
    char    c;
    char    *p, *q, *pattern = "C++";
    FILE    *fp = fopen( "A.hoge","rb" );

    p = pattern;
    while ( ( c = fgetc( fp ) ) != EOF ) {
        if ( c == *p ) {
            p++;
            if ( ! *p ) {
                printf( "しーぷらすぷらす" );
                p = pattern;
            }
            continue;
        }
        else if ( p != pattern ) {
            for ( q=pattern; q!=p; q++ )
                putchar( *q );
            p = pattern;
        }
        putchar( c );
    }

    fclose( fp );
}

引用返信 編集キー/
■28665 / inTopicNo.53)  Re[19]: バイナリコード内の16進数での文字列検索
□投稿者/ επιστημη (1389回)-(2008/11/28(Fri) 16:26:07)
επιστημη さんの Web サイト
なるほど巧いなー。バッファ要らずかー。

引用返信 編集キー/
■28666 / inTopicNo.54)  Re[19]: バイナリコード内の16進数での文字列検索
□投稿者/ .SHO (232回)-(2008/11/28(Fri) 16:29:01)
自分でバグ見っけました!(笑)

char c は int c です。
これ、バイナリファイルを扱うんだった。。。
引用返信 編集キー/
■28668 / inTopicNo.55)  Re[20]: バイナリコード内の16進数での文字列検索
□投稿者/ επιστημη (1390回)-(2008/11/28(Fri) 16:35:13)
επιστημη さんの Web サイト
> これ、バイナリファイルを扱うんだった。。。

題意にはなかったけど、
pattern/replaceもバイナリを許すとなるとかなり厄介なことになりそっすね。
'\0'終端をアテにできんもんね。
引用返信 編集キー/
■28669 / inTopicNo.56)  Re[21]: バイナリコード内の16進数での文字列検索
□投稿者/ .SHO (233回)-(2008/11/28(Fri) 16:39:13)
No28668 (επιστημη さん) に返信

> 題意にはなかったけど、
> pattern/replaceもバイナリを許すとなるとかなり厄介なことになりそっすね。
> '\0'終端をアテにできんもんね。

ですね。
'\0'終端できない以上、サイズを別に持つしか手がないですね。
引用返信 編集キー/
■28670 / inTopicNo.57)  Re[20]: バイナリコード内の16進数での文字列検索
□投稿者/ επιστημη (1391回)-(2008/11/28(Fri) 16:42:10)
επιστημη さんの Web サイト
ってわけで、16進表示から検索/置換まで、欲しいヒントはすべて揃いましたぜ > スレ主

引用返信 編集キー/
■28671 / inTopicNo.58)  Re[21]: バイナリコード内の16進数での文字列検索
□投稿者/ .SHO (234回)-(2008/11/28(Fri) 17:11:35)
さっきのコードは、とりあえず数分で一気に書きあげたんですが
検索対象ファイルの中に「CCCC++」みたいな文字があったり
検索する文字列が「CCC+++CCC+++」みたいに繰り返していて
途中まで一致したりとレアなケースにも完全に対応させました。
やっぱ、これ何気にめんどい。。。

#include <stdio.h>

void main() {
    int     c;
    char    *p, *q, *pattern = "CCC+++CCC+++";
    FILE    *fp = fopen( "A.hoge","rb" );

    p = pattern;
    while ( ( c = fgetc( fp ) ) != EOF ) {
        if ( c == *p ) {
            p++;
            if ( ! *p ) {
                printf( "しーぷらすぷらす" );
                p = pattern;
            }
        }
        else if ( p != pattern ) {
            ungetc( c, fp );
            for ( p--; p != pattern; p-- )
                ungetc( *p, fp );
            putchar( *pattern );
        }
        else
            putchar( c );
    }

    fclose( fp );
}

引用返信 編集キー/
■28674 / inTopicNo.59)  Re[22]: バイナリコード内の16進数での文字列検索
□投稿者/ επιστημη (1392回)-(2008/11/28(Fri) 17:37:11)
επιστημη さんの Web サイト
> for ( p--; p != pattern; p-- )
> ungetc( *p, fp );

ungetcっていくつも戻せるっけ? 一回こっきりじゃないっけ?

引用返信 編集キー/
■28675 / inTopicNo.60)  Re[23]: バイナリコード内の16進数での文字列検索
 
□投稿者/ .SHO (235回)-(2008/11/28(Fri) 17:45:40)
No28674 (επιστημη さん) に返信
>> for ( p--; p != pattern; p-- )
>> ungetc( *p, fp );
>
> ungetcっていくつも戻せるっけ? 一回こっきりじゃないっけ?

戻せますよ。読み込んだ分だけ戻せます。
かなり前だけど、ストリーム関連のソースは全部読んだので
どういう仕組みで戻してるのかもわかってるので間違いないです。
引用返信 編集キー/

<前の20件 | 次の20件>
トピック内ページ移動 / << 0 | 1 | 2 | 3 >>

管理者用

- Child Tree -