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

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

新規登録して質問してみよう
ただいま回答率
85.48%
char

charは文字データ型を指します。一文字分の文字コードの格納を想定としている型です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

2543閲覧

unsigned char型の配列の4バイトを取り出して整数に変換したい。

退会済みユーザー

退会済みユーザー

総合スコア0

char

charは文字データ型を指します。一文字分の文字コードの格納を想定としている型です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2022/01/06 00:46

編集2022/01/06 01:36

提示コードのコメント部内部のコードですが header変数で128バイトのunsigned char型変数を使って.ddsファイルのヘッダーファイルを読み込んでいるのですが。このheader変数の4バイトをint型に変換したいのですがそれをするにはどうしたらいいのでしょうか?
提示コードのような形になると思うのですが上手く実装できません。この値は255になります。

参考サイト: https://dench.flatlib.jp/ddsformat

cpp

1 2 unsigned long headerSize = 0; 3 unsigned long header[128 / 8] = { 0 }; 4 fread(header, sizeof(unsigned long), 128 / 8, file); //ヘッダーサイズ 5 6 printf(" ああああ %lu\n",header[3]); 7 8

上記のようなやり方で画像のYの大きさの出力を試しましたが上手く出力されません。
イメージ説明

cpp

1 2 for (int i = 0; i < textureNum; i++) 3 { 4 printf("%d\n",i); 5 texture.push_back(Image{ FrameWork::Texture{glm::ivec2(0,0),0},"\0" }); 6 7 unsigned char *data = NULL; 8 glm::ivec2 size = glm::ivec2(0,0); 9 unsigned char channel = 0; 10 char textureName[TEXTURE_FILE_PATH_SIZE] = {'\0'}; 11 unsigned long headerSize = 0; 12/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 13 unsigned char header[128]; 14 fread(textureName, sizeof(char), TEXTURE_FILE_PATH_SIZE, file); //テクスチャ名 15 fread(header, sizeof(unsigned char), 128, file); //ヘッダーサイズ 16 17 printf("zああああ %d\n",header[12] | header[13] | header[14] | header[15]); 18/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 19 20 21 22 23 24 25 26 glGenTextures(1, &texture.back().image.ID); //テクスチャIDの生成 27 glBindTexture(GL_TEXTURE_2D, texture.back().image.ID); //IDバインド 28 29 texture.back().image.size = size; 30 31 //テクスチャ生成 32 if (channel == (unsigned char)4) 33 { 34 data = (unsigned char*)malloc(static_cast<size_t>(size.x * size.y * 4)); 35 fread(data, sizeof(unsigned char), static_cast<size_t>(size.x * size.y * 4), file); 36 glCompressedTexImage2D(GL_TEXTURE_2D, 50, GL_COMPRESSED_RGBA_BPTC_UNORM_ARB, size.x,size.y,0,(size.x * size.y * 4),data); 37 } 38 else if (channel == (unsigned char)3) 39 { 40 data = (unsigned char*)malloc(static_cast<size_t>(size.x * size.y * 3)); 41 fread(data, sizeof(unsigned char), static_cast<size_t>(size.x* size.y * 3), file); 42 glCompressedTexImage2D(GL_TEXTURE_2D, 50, GL_COMPRESSED_RGBA_BPTC_UNORM_ARB, size.x, size.y, 0, (size.x * size.y * 3), data); 43 } 44 else if (channel == (unsigned char)2) 45 { 46 data = (unsigned char*)malloc(static_cast<size_t>(size.x * size.y * 2)); 47 fread(data, sizeof(unsigned char), static_cast<size_t>(size.x* size.y * 2), file); 48 glCompressedTexImage2D(GL_TEXTURE_2D, 50, GL_COMPRESSED_RGBA_BPTC_UNORM_ARB, size.x, size.y, 0, (size.x * size.y * 2), data); 49 } 50 else if (channel == (unsigned char)1) 51 { 52 data = (unsigned char*)malloc(static_cast<size_t>(size.x * size.y * 1)); 53 fread(data, sizeof(unsigned char), static_cast<size_t>(size.x* size.y * 1), file); 54 glCompressedTexImage2D(GL_TEXTURE_2D, 50, GL_COMPRESSED_RGBA_BPTC_UNORM_ARB, size.x, size.y, 0, (size.x * size.y * 1), data); 55 } 56 else 57 { 58 std::cerr << "未対応の形式のチャンネル数です: " << textureName << " " << "チャンネル数: " << channel << std::endl; 59 assert(0); 60 } 61 62 63 64 texture.back().name = std::string(textureName); 65 // テクスチャの補間設定 66 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 67 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 68 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 69 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 70 glGenerateMipmap(GL_TEXTURE_2D); 71 glBindTexture(GL_TEXTURE_2D, 0); 72 73 free(data); //解放 74 data = NULL; 75 }

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

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

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

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

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

guest

回答2

0

C

1#define TODWORD(s) ((uint8_t*)(s)[0] | ((uint8_t*)(s)[1]<<8) | ((uint8_t*)(s)[2]<<16) | ((uint8_t*)(s)[3]<<24)) 2 3 4printf("zああああ %d\n", TODWORD(header+12);

ってなことをしますね

投稿2022/01/06 01:05

編集2022/01/06 01:29
y_waiwai

総合スコア87749

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

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

0

ベストアンサー

Windows環境で動かすなら、unsigned char header[128] に読み込むのではなくて、DDS_HEADER の変数を用意してそこにfread() して dwWidth などにアクセスすればよいでしょう。

リトルエンディアンのWindows以外の環境で動かすなら、上記 DDS_HEADER に相当する構造体を自分で定義して使う手があります。

質問文の元のコードを尊重するなら、

printf("zああああ %d\n", header[12] | (header[13] << 8) | (header[14] << 16) | (header[15] << 24));

のようにします。


更新された質問文のコードに関して:

cpp

1uint32_t header[128 / sizeof(uint32_t)] = { 0 }; 2fread(header, sizeof(uint32_t), 128 / sizeof(uint32_t), file); 3printf(" ああああ %" PRIu32 "\n", header[3]);

でしょう。DWORD は32bit整数です。unsigned long は環境によって64bitの可能性があります。

投稿2022/01/06 00:54

編集2022/01/06 01:23
int32_t

総合スコア20845

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

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

退会済みユーザー

退会済みユーザー

2022/01/06 00:58

なるほど。もしwindow以外の環境で動かす場合どういった手段を用いるのでしょうか?
int32_t

2022/01/06 01:09

回答に追記しました
退会済みユーザー

退会済みユーザー

2022/01/06 01:31

なるほど。以下ようにしたのですがおかしな値が出力されるのですがこれは何が原因なのでしょうか? fread()関数のファイルの読み取り位置の場違いによるバグを確認しましたがファイル名が出力されたため違います。 fread(textureName,sizeof(char),TEXTURE_FILE_PATH_SIZE,file); printf("textureName %s\n",textureName); // #define DDS_HEADER_SIZE ((size_t)(128)) unsigned char header[DDS_HEADER_SIZE] = { "\0" }; fread(header, sizeof(unsigned char), DDS_HEADER_SIZE, file); //ヘッダーサイズ printf(" ああああ %d\n", (int)((header[12]) | (header[13] << 8) | (header[14] << 16) | (header[15] << 24)) );
int32_t

2022/01/06 01:38

その部分はとくに問題ないように見えます。 > おかしな値が出力される 「おかしな値」だと現象から問題を推測するのが不可能なので、期待する値と実際に出る値を書いてください。 まずは header に読み込まれた128バイトを画面に表示したりデバッガて中身を確認してみるのがデバッグの第一歩ですかね。
退会済みユーザー

退会済みユーザー

2022/01/06 02:23

texconve.exeというソフト使って.dds変換を行っていましてそこ際にファイルサイズが設定されていなかったためでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問