提示コードですが上のコードはバイナリの連結を実験したものです。下のコードは.pngファイルの実データ部を表示させる関数です。
下のコードで複数あるIDATチャンクの実データを一つにまとめる必要があるでバイナリの連結が発生すると思うのですがどのやり方がベターなののでしょか?上のコードでしょうか?
[これを行う目的]
.pngデータのIDATAチャンクの実データを取り出したい。が複数存在するのでそれを一つにまとめたい。
また提示コードの// #### コメント内部のコードでアクセスエラーは発生するのですがこれはなぜでしょうか?
cpp
1#include <iostream> 2#include "string.h" 3 4 5unsigned char* gPictureData; 6 7void AddPictureData(const unsigned char* data) 8{ 9 int size = sizeof((char*)gPictureData) + sizeof((char*)data); 10 11 unsigned char* str = new unsigned char[size] {0x00}; 12 13 14 strcat_s((char*)str, sizeof(str), (char*)gPictureData); 15 16 // ######################################################## 17 strcat_s((char*)str, sizeof(str), (char*)data); 18 // ######################################################## 19 20 21 delete gPictureData; 22 gPictureData = nullptr; 23 24 25 26 27 28 //gPictureData = new unsigned char[size]{0x00}; 29 //strcat_s((char*)gPictureData, sizeof(str), (char*)str); 30 //gPictureData[size + 1] = '\0'; 31} 32 33int main() 34{ 35 gPictureData = new unsigned char[5]{0x00,0x00,0x00,0x00}; 36 const unsigned char* st = new unsigned char[5]{ 0x01,0x01,0x01,0x01 }; 37 38 39 40 for (int i = 0; i < sizeof(gPictureData); i++) 41 { 42 printf("%x ", gPictureData[i]); 43 44 } 45 46 printf("\n\n\n"); 47 48 AddPictureData(st); 49 50 for (int i = 0; i < sizeof(gPictureData); i++) 51 { 52 printf("%x ", gPictureData[i]); 53 54 } 55 56 57 58 59 return 0; 60}
cpp
1 2 3// ###################### IDAT チャンクを表示 ###################### 4/* 5* データのバイナリをコピーして表示 6*/ 7void ImagePrint(const char* fileName, int pos,char* copy,int copySize) 8{ 9 std::fstream fs(fileName, std::ios_base::binary | std::ios_base::in); 10 11 if (fs.is_open() == false) 12 { 13 std::cerr << "ファイルが開けません。" << std::endl; 14 } 15 else 16 { 17 //std::cout << "ファイルを開きました。" << std::endl; 18 19 size_t fileSize = fs.seekg(0, fs.end).tellg(); //ファイルサイズ 20 printf("fileSize: %zd\n",fileSize); 21 fs.seekg(0, fs.beg); //シーク位置を初期に戻す 22 unsigned char* fileData = new unsigned char[fileSize]; //ファイルデータ 23 fs.read((char*)fileData, fileSize); //バイナリ読み込み 24 25 ///////////////////////////////////////////////////////////////////////////// 26 //BytePrint("texture.png",pos - 8, pos - 4); 27 28 int dataSize = convInt(fileData, pos - 8); 29 30 31 printf("dataSize: %d\n",dataSize); 32 33 int a = 0; 34 for (int i = pos; i < dataSize; i++) 35 { 36 std::cout<< (unsigned int)fileData[i]<<" "; 37 38 a++; 39 if (a == 20) 40 { 41 printf("\n"); 42 a = 0; 43 } 44 } 45 46 47 //////////////////////////////////////////////////////////////////////////// 48 49 50 51 52 53 54 fs.seekg(0, fs.beg); //シーク位置を初期に戻す 55 delete fileData; //メモリ開放 56 57 } 58 59 fs.close(); //ファイルを閉じる 60 61}
> 下のコードで複数あるIDATチャンクの実データを一つにまとめる必要があるので文字列の連結が発生すると思うのですがどのやり方がベターなののでしょか?上のコードでしょうか?
すみません、「文字列の連結が発生すると思う」の箇所がよくわかりません
IDATチャンクの実データは文字列ではないと思いますが
userisgodさんが言われるように、pngの実データは文字列ではないケースもあるので、このままのコードで良いと思いましたー。
IDATは文字列ではありませんが、std::string はバイナリも問題なく扱えるので、episteme さんの回答で良いかと思います。
複数個所でポインタのサイズを取得・使用していますが何を意図してるのでしょうか
それ以外にもnew/deleteなどかなり恐い作りになっていますが……
連結がしたいのです。 そのためにはまず連結後のサイズを取得して連結後の文字列を作成してそれを連結後を保存したい変数に上書きしてます。動的確保なのでnew /delete を結構使っていますw間違えているやり方だと後で知りましたがあまり提示コードを書き換えるのはよくないのでこのままです。
これまでの質問を追っていないので把握していないのですが、そもそもとして
> 複数あるIDATチャンクの実データを一つにまとめる必要がある
本当にその必要があるのですか?
さらにそれ以前に、最終的になにをしたいのか、見失っていたりはしませんか?
そもそも何をしようとしていたのか、整理してみてはいかがですか?
伝わらなかったのでやや冗長に書き直しますね
なぜ、確保した配列の大きさではなく、ポインタの大きさを取得しているのでしょうか
ポインタが8バイト(64ビット)の環境であると以下の箇所は、範囲外を参照するループとなっています
> gPictureData = new unsigned char[5]{0x00,0x00,0x00,0x00};
> for (int i = 0; i < sizeof(gPictureData); i++)
> {
> printf("%x ", gPictureData[i]);
> }
> まず連結後のサイズを取得して
ポインタのサイズを取得、それを加算しているだけですが理解していますか?
わからないようであれば、sizeof演算子について調べてみてください
OpenGLでPNGを使用するという流れからきてるとは思うのですが、
その時点で、「stb_image.h」を使うという回答がついており、正直やりたいことがわかりません
このまま、PNGの圧縮やらフィルタやらまで続けていくつもりなのでしょう
(仮にIDATを連結したところで、glTexImage2Dには直接使用できないので)
この人に小手先の解決法を提示したところで無意味なのは過去の質問を見ても明らか。(むしろクレクレ君状態になってるのを増長してるだけで害悪ですらある)
とりあえず行き当たりばったりで判らない事やエラーに遭遇するとまったく自分で調べず丸投げで質問するだけで、回答貰ってその場しのぎしてもその内容は理解しない(そもそも出来ない)から、また同じような質問を繰り返すだけ。
> unsigned char* gPictureData;
> void AddPictureData(const unsigned char* data) { ... }
ナニがしたんでしょうか?
gPictureDataの末尾にdataを連結したいんですか?
だとするとgPictureDataの末尾をどうやって得るんですか? (sizeof は使えません)
そこがわからないのです。
"そこ”ってどこですか?
それと、gPictureDataの末尾にdataを連結するとして、gPictureDataに連結できるだけの領域が確保されている保証はどこにあるんですか?
> gPictureDataの末尾をどうやって得る
です
もうひとつ、末尾位置を保持する変数を用意しておけばいいんじゃないですか?
で、どうやるかわからなくて苦戦するくらいなら std::string 使えばいいんじゃないんですか?
そうですか。ちょっとそれますが.png ファイルは複数のiDATチャンクが存在する場合それらを足し合わせる必要があるのでしょうか?
そもそもいっつも質問文変だし日本語の勉強からしたらいいよ。
これだけアドバイス貰っても理解出来ないんだから。
それはまた別の質問です。
足し合わせる必要があるかわからんのになんで足し合わせる質問するん?
[XY問題]
https://ja.wikipedia.org/wiki/XY%E5%95%8F%E9%A1%8C
XY問題とは、ヘルプデスクなどで見られる「質問者が、本当に解決したい課題Xについて直接聞くのではなく、Yという二次的な課題を解決する方法を聞く」ことによって発生するコミュケーション上の問題を指す語である。 質問者はYによってXを解決することができると考えているが、しかし、Yを解決してもXは解決しないか、またはYは解決方法としては不十分であることが多い。本質的な課題を曖昧にしたり二次的問題を持ち込んだりすることは、回答者に不必要な苦労をさせたり、または不十分な解決方法が提示されることにつながる。
回答2件
あなたの回答
tips
プレビュー