jpegのエンドマーカー判定方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: jpegのエンドマーカー判定方法

Re: jpegのエンドマーカー判定方法

#2

by かずま » 8年前

現在多くの CPU は、リトルエンディアンです。

ファイルのサイズが偶数の時、最後にある FF D9 は、short の buffer に
0xD9FF として入ります。だから、" Found 0xFFD9\n" が出ません。

ファイルのサイズが奇数の時、例えば、最後が 3F FF D9 だったとすれば、
buffer に 0xFF39 が入った後、最後の 1バイトの D9 だけが buffer の下位
1バイトに上書きされ、buffer が 0xFFD9 になり、" Found 0xFFD9\n" が出ます。

2バイトずつではなく、1バイトずつ読み込むようにしたほうが良いでしょう。

コード:

#include <stdio.h> // fopen, fclose, fseek, ftell, getc, putc, puts, printf
 
int main(int argc, char *argv[])
{
    FILE *fp1 = fopen(argv[1], "rb");
    if (!fp1) return printf("can't open %s\n", argv[1]), 1;
    FILE *fp2 = fopen(argv[2], "wb");
    if (!fp2) return printf("can't create %s\n", argv[2]), 2;
    long read_sum = 0, file_size;
    int c;

    fseek(fp1, 0, SEEK_END);
    file_size = ftell(fp1);
    fseek(fp1, 0, SEEK_SET);
    while ((c = getc(fp1)) != EOF) {
        read_sum++, putc(c, fp2);
        if (c == 0xff) {
            if ((c = getc(fp1)) == EOF) break;
            read_sum++, putc(c, fp2);
            if (c == 0xd9) {
                puts(" Found 0xFFD9");
                break;
            }
        }
    }
    fclose(fp2), fclose(fp1);
    if (read_sum != file_size) puts(" Not Copied Completely");
    return 0;
}

jpegのエンドマーカー判定方法

#1

by masyumaro_sec » 8年前

jpegのエンドマーカーである0xFFD9を判定して終了する方法が知りたいです。
ファイルをコピーする事が目的では無く、判定する方法が知りたいです。
以下のコードだと、想定通りに動きません。
想定している動作としては、ファイルが全てコピーできてif文内のprintf(" Found 0xFFD9\n");が
実行される事です。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]){

 int read_sum = 0;
 int read_size = 0;
 long file_size = 0;
 unsigned short buffer = 0;
 FILE *fp1 = fopen(argv[1], "rb");
 FILE *fp2 = fopen(argv[2], "wb");

 fseek(fp1, 0, SEEK_END);
 file_size = ftell(fp1);
 fseek(fp1, 0, SEEK_SET);

 while(read_sum != file_size){
  read_size = fread(&buffer, 1, 2, fp1);
  read_sum += read_size;
  if(buffer == 0xFFD9){
   fwrite(&buffer, 1, read_size, fp2);
   printf(" Found 0xFFD9\n");
   break;
  }
  fwrite(&buffer, 1, read_size, fp2);
 }
 fclose(fp1);
 return 0;

}

ページトップ