質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1098閲覧

memchr関数を使ってバイナリファイルから"IDATA"16進数の位置を取得したい。

退会済みユーザー

退会済みユーザー

総合スコア0

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/04/30 03:51

提示コードの// ##### コメント内部のコードですがmemchr関数で16進数のバイナリ[ 49 44 41 54 ] を見つけてその場所を知りたいいのですがどんな関数を使えばいいのでしょうか memchr関数は1文字しか検索できないため困っています。

参考サイト: http://simd.jugem.jp/?eid=140

cpp

1 2 3void ImageDataPrint(const char *fileName) 4{ 5 std::fstream fs(fileName, std::ios_base::binary | std::ios_base::in); 6 7 if (fs.is_open() == false) 8 { 9 std::cerr << "ファイルが開けません。" << std::endl; 10 } 11 else 12 { 13 //std::cout << "ファイルを開きました。" << std::endl; 14 15 size_t fileSize = fs.seekg(0, fs.end).tellg(); //ファイルサイズ 16 17 fs.seekg(0, fs.beg); //シーク位置を初期に戻す 18 char* fileData = new char[fileSize]; //ファイルデータ 19 fs.read(fileData, fileSize); //バイナリ読み込み 20 21 22 23 // ########################################################################### 24 unsigned int searchPos = 49444154; 25 memchr(fileData,searchPos,sizeof(char) * 4); 26 27 28 if (searchPos != NULL) 29 { 30 31 printf("%d\n",searchPos); 32 std::cout << searchPos << std::endl; 33 34 for (int i = 0; i < fileSize; i++) 35 { 36 37 } 38 } 39 else { 40 std::cerr << "チャンクが見つかりません。" << std::endl; 41 } 42 // ########################################################################### 43 44 45 46 47 48 49 fs.seekg(0, fs.beg); //シーク位置を初期に戻す 50 delete fileData; //メモリ開放 51 52 } 53 54 fs.close(); //ファイルを閉じる 55 56} 57 58

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

素直に、「IHDRから順にチャンクの先頭+チャンクの長さと進んで、次のチャンクの先頭を割り出す」という処理を繰り返すのが適切ではないでしょうか?

投稿2021/04/30 03:56

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/04/30 03:58

そうするかしかなのでしょうか?何かしらの関数があると思うのですが
maisumakun

2021/04/30 03:58

なお、IDATは複数に分割されていることもありえます。
maisumakun

2021/04/30 04:03

> そうするかしかなのでしょうか? むしろ、そうすべきです。 iTXtなど任意のデータを入れられるチャンクもありますので、そこに無関係な「IDAT」という文字が入る危険もあります。
maisumakun

2021/04/30 04:08 編集

> 何かしらの関数があると思うのですが PNGの処理に特化した関数はあるかもしれないですね。
退会済みユーザー

退会済みユーザー

2021/04/30 04:14

正直libpngなり読めるライブラリやAPI使えば案件な気が。 勉強のために自力解析したいなら、他人に聞くのがそもそも間違い。
guest

0

'I'の場所を探してみつけたら、次が'D'であること、その次が'A'であること、その次が...
を調べて、最後の'A'まで合致したら発見、合致しなかったら'I'の次から検索を再開すればよいのでは。

それが自分で書けないなら、「文字列」の扱いについて徹底的に復習してください。

投稿2021/04/30 03:59

thkana

総合スコア7610

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/04/30 04:15

質問ですが16進数の数値を以下のように検索したいのですが見つかりませんこれはなぜなのでしょうか? char* searchPos = NULL; unsigned char I = 0x49; unsigned char D = 0x44; unsigned char A = 0x41; unsigned char T = 0x54; searchPos = (char*)memchr(fileData, I, sizeof(unsigned char)); if (searchPos != NULL) { printf("aaaa"); } else { std::cerr << "見つかりません。" << std::endl; }
退会済みユーザー

退会済みユーザー

2021/04/30 04:22 編集

横から失礼します。 saijou_chan さん 「memchr()」の引数はそれぞれ何を指しているかわかっていますか? 関数自体を調べて、それでもわからないようなら、もっと基礎的なことからはじめた方がいいと思います。
退会済みユーザー

退会済みユーザー

2021/04/30 04:26 編集

第一引数は検索するバッファで 第二引数は検索するデータ 第三引数はそのサイズです。 int にしましたが表示されません。
退会済みユーザー

退会済みユーザー

2021/04/30 04:42 編集

「そのサイズ」とは、検索するデータのサイズのこと、ということでよろしいでしょうか。 まあ、使われ方から、そういう認識なんだろうと思います。 man、Microsoft Docs、そのほか入門寄りのサイトでもいいので、 一度関数について調べて、ちゃんと読んだ方がいいと思います。 > memchr関数は1文字しか検索できないため困っています。 と書いておきながら、検索するデータ(1文字しか検索できない)のサイズを指定しているところ、 何かおかしいと思いませんか?
dodox86

2021/04/30 05:21

> それが自分で書けないなら、「文字列」の扱いについて徹底的に復習してください。 同じ思いですので、高評価しました。strstr()の言うなればメモリ版、memmem()が無ければ、自分で作れば良いだけのこと。 https://linuxjm.osdn.jp/html/LDP_man-pages/man3/memmem.3.html
thkana

2021/04/30 06:18

> 見つかりませんこれはなぜなのでしょうか? 間違っているからです。他になにがありますか? この期に及んでコンパイルを通せばOK、とか思っていせんよね? > 第一引数は検索するバッファで > 第二引数は検索するデータ > 第三引数はそのサイズです。 日本語にも慎重になりましょう。「検索するバッファ」と「検索するデータ」、この二つを並べて同じものではない、ということを明確にするにはどう表現するか、そして「その」はどちらを指しているのか。 そういうのを意識していれば、プログラムでもなかなか間違えないと思うのですがどうでしょう。 (プログラムを組めない人の半分くらいは日本語がまともに構成できないところに根っこがあるんじゃないかと思っていたりします。ちゃんと喋らないで相手の想像力に助けてもらっているから、想像力0のコンピュータ相手にはコトバが全く通じない、とか)
guest

0

ベストアンサー

maisumakunさんの回答を支持したうえで、

要素列の中から要素列を見つけたいなら
std::search 使えばいいんじゃないかと。

C++

1#include <algorithm> 2#include <iostream> 3#include <iterator> 4 5int main() { 6 /* applebananacherry から banana を探す */ 7 char data[] = "applebananacherry"; 8 char target[] = { 'b', 'a', 'n', 'a', 'n', 'a'}; 9 auto iter = std::search(std::begin(data), std::end(data), 10 std::begin(target), std::end(target)); 11 if ( iter != std::end(data) ) { 12 std::cout << "found at " << std::distance(std::begin(data), iter) << std::endl; 13 } 14}

投稿2021/04/30 04:41

編集2021/04/30 07:04
episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問