プログラミングのメモ書きです。日記も兼ねてます。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
よくデジカメなどで使われる「Exif」を読み込んでみます。(2日目)
今日は、いよいよメインの情報を読んでいきます。
とその前に、昨日のバグが直りました。
char Head [0x10]={0};//ヘッダ
を、
unsigned char Head [0x10]={0};//ヘッダ
にしたら、正しく取得できました。
さて、メインの情報ですが、
タグ、格納値タイプ、格納値数、格納値
の順で並んでいます。
全部で12バイトですのでまた全部読んじゃいます。
if(fseek(File,offset*12+0x16,SEEK_SET))return false;
for(i=0;i<12;i++){
Buf[i]=fgetc(File);
printf("%02d:0x%02X\n",i,Buf[i]);
}
fseekは、読み込み開始位置をずらす関数です。(本当はちょっと違うけど…)
この関数で、読み込み位置に移動して読み込みを開始します。
次は読み込んだデータの振り分けです。
変数一つ一つに保存すると面倒なので、構造体を使っています。
構造体の定義
//ディレクトリ構造体
typedef struct EXIF_DIRECTORYtag{
unsigned short TAG ;
unsigned short Type;
unsigned short DataNum;
unsigned int Data;
}EXIF_DIRECTORY;
ここに、読み込んだデータを格納していきます。
pED->TAG =(type)?Buf[0]<<8 |Buf[1]:Buf[0]|Buf[1]<<8;
pED->Type =(type)?Buf[2]<<8 |Buf[3]:Buf[2]|Buf[3]<<8;
pED->DataNum=(type)?Buf[4]<<32|Buf[5]<<16|Buf[6]<<8 |Buf[7] :Buf[7]<<32 |Buf[6]<<16 |Buf[5]<<8|Buf[4];
pED->Data =(type)?Buf[8]<<32|Buf[9]<<16|Buf[10]<<8|Buf[11]:Buf[11]<<32|Buf[10]<<16|Buf[9]<<8|Buf[8];
昨日取っておいた「type」がここでも使われています。
ところで格納値についてなのですが、ここには単純に値が入るだけではなく値が入ってるオフセットが入ることもあるそうです。
そこのところは面倒なのでまた別の日にすることにします。(いつになるかなぁ(^ω^;))
ソースを乗っけておきますんでどうぞ。
ちなみに、今回からC言語で書いています。(前回は、C++)
ソースのダウンロード(zip)
では。
とその前に、昨日のバグが直りました。
char Head [0x10]={0};//ヘッダ
を、
unsigned char Head [0x10]={0};//ヘッダ
にしたら、正しく取得できました。
さて、メインの情報ですが、
タグ、格納値タイプ、格納値数、格納値
の順で並んでいます。
全部で12バイトですのでまた全部読んじゃいます。
if(fseek(File,offset*12+0x16,SEEK_SET))return false;
for(i=0;i<12;i++){
Buf[i]=fgetc(File);
printf("%02d:0x%02X\n",i,Buf[i]);
}
fseekは、読み込み開始位置をずらす関数です。(本当はちょっと違うけど…)
この関数で、読み込み位置に移動して読み込みを開始します。
次は読み込んだデータの振り分けです。
変数一つ一つに保存すると面倒なので、構造体を使っています。
構造体の定義
//ディレクトリ構造体
typedef struct EXIF_DIRECTORYtag{
unsigned short TAG ;
unsigned short Type;
unsigned short DataNum;
unsigned int Data;
}EXIF_DIRECTORY;
ここに、読み込んだデータを格納していきます。
pED->TAG =(type)?Buf[0]<<8 |Buf[1]:Buf[0]|Buf[1]<<8;
pED->Type =(type)?Buf[2]<<8 |Buf[3]:Buf[2]|Buf[3]<<8;
pED->DataNum=(type)?Buf[4]<<32|Buf[5]<<16|Buf[6]<<8 |Buf[7] :Buf[7]<<32 |Buf[6]<<16 |Buf[5]<<8|Buf[4];
pED->Data =(type)?Buf[8]<<32|Buf[9]<<16|Buf[10]<<8|Buf[11]:Buf[11]<<32|Buf[10]<<16|Buf[9]<<8|Buf[8];
昨日取っておいた「type」がここでも使われています。
ところで格納値についてなのですが、ここには単純に値が入るだけではなく値が入ってるオフセットが入ることもあるそうです。
そこのところは面倒なのでまた別の日にすることにします。(いつになるかなぁ(^ω^;))
ソースを乗っけておきますんでどうぞ。
ちなみに、今回からC言語で書いています。(前回は、C++)
ソースのダウンロード(zip)
では。
PR
この記事にコメントする