teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

文章を修正しました。

2021/05/01 02:21

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,12 @@
1
1
  提示コードですが上のコードはバイナリの連結を実験したものです。下のコードは.pngファイルの実データ部を表示させる関数です。
2
2
  下のコードで複数あるIDATチャンクの実データを一つにまとめる必要があるでバイナリの連結が発生すると思うのですがどのやり方がベターなののでしょか?上のコードでしょうか?
3
3
 
4
+
5
+ [これを行う目的] 
6
+ .pngデータのIDATAチャンクの実データを取り出したい。が複数存在するのでそれを一つにまとめたい。
7
+
8
+
9
+
4
10
  また提示コードの// #### コメント内部のコードでアクセスエラーは発生するのですがこれはなぜでしょうか?
5
11
 
6
12
 

2

提示コードを修正

2021/05/01 02:21

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -66,4 +66,68 @@
66
66
 
67
67
  return 0;
68
68
  }
69
+ ```
70
+
71
+ ```cpp
72
+
73
+
74
+ // ###################### IDAT チャンクを表示 ######################
75
+ /*
76
+ * データのバイナリをコピーして表示
77
+ */
78
+ void ImagePrint(const char* fileName, int pos,char* copy,int copySize)
79
+ {
80
+ std::fstream fs(fileName, std::ios_base::binary | std::ios_base::in);
81
+
82
+ if (fs.is_open() == false)
83
+ {
84
+ std::cerr << "ファイルが開けません。" << std::endl;
85
+ }
86
+ else
87
+ {
88
+ //std::cout << "ファイルを開きました。" << std::endl;
89
+
90
+ size_t fileSize = fs.seekg(0, fs.end).tellg(); //ファイルサイズ
91
+ printf("fileSize: %zd\n",fileSize);
92
+ fs.seekg(0, fs.beg); //シーク位置を初期に戻す
93
+ unsigned char* fileData = new unsigned char[fileSize]; //ファイルデータ
94
+ fs.read((char*)fileData, fileSize); //バイナリ読み込み
95
+
96
+ /////////////////////////////////////////////////////////////////////////////
97
+ //BytePrint("texture.png",pos - 8, pos - 4);
98
+
99
+ int dataSize = convInt(fileData, pos - 8);
100
+
101
+
102
+ printf("dataSize: %d\n",dataSize);
103
+
104
+ int a = 0;
105
+ for (int i = pos; i < dataSize; i++)
106
+ {
107
+ std::cout<< (unsigned int)fileData[i]<<" ";
108
+
109
+ a++;
110
+ if (a == 20)
111
+ {
112
+ printf("\n");
113
+ a = 0;
114
+ }
115
+ }
116
+
117
+
118
+ ////////////////////////////////////////////////////////////////////////////
119
+
120
+
121
+
122
+
123
+
124
+
125
+ fs.seekg(0, fs.beg); //シーク位置を初期に戻す
126
+ delete fileData; //メモリ開放
127
+
128
+ }
129
+
130
+ fs.close(); //ファイルを閉じる
131
+
132
+ }
69
133
  ```

1

文章を修正しました。

2021/05/01 02:01

投稿

退会済みユーザー
title CHANGED
@@ -1,1 +1,1 @@
1
- 文字列を連結する方法としてベターなやり方が知りたい。
1
+ バイナリを連結する方法としてベターなやり方が知りたい。
body CHANGED
@@ -1,86 +1,69 @@
1
- 提示コードですが上のコードは文字列の連結を実験したものです。下のコードは.pngファイルの実データ部を表示させる関数です。
1
+ 提示コードですが上のコードはバイナリの連結を実験したものです。下のコードは.pngファイルの実データ部を表示させる関数です。
2
- 下のコードで複数あるIDATチャンクの実データを一つにまとめる必要がある文字列の連結が発生すると思うのですがどのやり方がベターなののでしょか?上のコードでしょうか?
2
+ 下のコードで複数あるIDATチャンクの実データを一つにまとめる必要があるでバイナリの連結が発生すると思うのですがどのやり方がベターなののでしょか?上のコードでしょうか?
3
3
 
4
+ また提示コードの// #### コメント内部のコードでアクセスエラーは発生するのですがこれはなぜでしょうか?
4
5
 
5
6
 
6
7
 
7
-
8
8
  ```cpp
9
9
  #include <iostream>
10
10
  #include "string.h"
11
11
 
12
- int main() {
13
12
 
14
- char* str1 = new char[10]{'\0'};
13
+ unsigned char* gPictureData;
15
- char* str2 = new char[10]{'\0'};
16
14
 
15
+ void AddPictureData(const unsigned char* data)
16
+ {
17
- char* str3 = new char[sizeof(str1) + sizeof(str2) + 1];
17
+ int size = sizeof((char*)gPictureData) + sizeof((char*)data);
18
18
 
19
- strcat_s(str3, sizeof(str3),str2);
19
+ unsigned char* str = new unsigned char[size] {0x00};
20
20
 
21
+
21
- return 0;
22
+ strcat_s((char*)str, sizeof(str), (char*)gPictureData);
22
- }
23
- ```
24
23
 
24
+ // ########################################################
25
- ```cpp
25
+ strcat_s((char*)str, sizeof(str), (char*)data);
26
+ // ########################################################
26
27
 
27
- // ###################### IDAT チャンクを表示 ######################
28
- /*
29
- * データのバイナリをコピーして表示
30
- */
31
- void ImagePrint(const char* fileName, int pos,char* copy,int copySize)
32
- {
33
- std::fstream fs(fileName, std::ios_base::binary | std::ios_base::in);
34
28
 
29
+ delete gPictureData;
35
- if (fs.is_open() == false)
30
+ gPictureData = nullptr;
36
- {
37
- std::cerr << "ファイルが開けません。" << std::endl;
38
- }
39
- else
40
- {
41
- //std::cout << "ファイルを開きました。" << std::endl;
42
31
 
43
- size_t fileSize = fs.seekg(0, fs.end).tellg(); //ファイルサイズ
44
- printf("fileSize: %zd\n",fileSize);
45
- fs.seekg(0, fs.beg); //シーク位置を初期に戻す
46
- unsigned char* fileData = new unsigned char[fileSize]; //ファイルデータ
47
- fs.read((char*)fileData, fileSize); //バイナリ読み込み
48
32
 
49
- /////////////////////////////////////////////////////////////////////////////
50
- //BytePrint("texture.png",pos - 8, pos - 4);
51
33
 
52
- int dataSize = convInt(fileData, pos - 8);
53
-
54
34
 
55
- printf("dataSize: %d\n",dataSize);
56
-
57
- int a = 0;
58
- for (int i = pos; i < dataSize; i++)
59
- {
60
- std::cout<< (unsigned int)fileData[i]<<" ";
61
35
 
62
- a++;
63
- if (a == 20)
36
+ //gPictureData = new unsigned char[size]{0x00};
64
- {
37
+ //strcat_s((char*)gPictureData, sizeof(str), (char*)str);
65
- printf("\n");
38
+ //gPictureData[size + 1] = '\0';
66
- a = 0;
67
- }
39
+ }
68
- }
69
-
70
40
 
41
+ int main()
42
+ {
43
+ gPictureData = new unsigned char[5]{0x00,0x00,0x00,0x00};
71
- ////////////////////////////////////////////////////////////////////////////
44
+ const unsigned char* st = new unsigned char[5]{ 0x01,0x01,0x01,0x01 };
45
+
72
46
 
73
47
 
48
+ for (int i = 0; i < sizeof(gPictureData); i++)
49
+ {
50
+ printf("%x ", gPictureData[i]);
74
51
 
52
+ }
75
53
 
54
+ printf("\n\n\n");
76
55
 
56
+ AddPictureData(st);
77
57
 
78
- fs.seekg(0, fs.beg); //シーク位置を初期に戻す
58
+ for (int i = 0; i < sizeof(gPictureData); i++)
59
+ {
79
- delete fileData; //メモリ開放
60
+ printf("%x ", gPictureData[i]);
80
61
 
81
62
  }
82
63
 
83
- fs.close(); //ファイルを閉じる
84
64
 
65
+
66
+
67
+ return 0;
85
68
  }
86
69
  ```