The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Заголовков в файле меньше, чем надо, !*! victorddt, 08-Фев-05, 10:56  [смотреть все]
Вот прога, которая призвана искать заголовки в файле (заголовком считаю строку из 2 байт - FF D8):

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>

#define BSIZE 2

int main()
{
    FILE *in, *out;
    unsigned char buffer[BSIZE];
    size_t act_read;
    long pos=0, now_pos;
    int really_read, i, c;

    i = 0;

    in=fopen("1.JPG","rb");
    out=fopen("1_1.JPG","wb");

    printf("\n\nSearching ...\n", i);
    while(1)
    {
        act_read=fread(buffer, BSIZE, 1, in);

        if(act_read > 0)
        {
            fwrite(buffer, BSIZE, 1, out);
            
            if(buffer[0] == 0xFF && buffer[1] == 0xD8)
            {
                i++;                
            }
        }
        else
        {
            break;
        }
    }
    printf("Searching complete...\n", i);
    printf("Found %i file(s)\n\n", i);
}

Поиск ведется в файле 1.JPG. Реально заголовков там, например, 204 шт, а i (счетчик) в конце равно 101.

Что здесь не так?

  • Заголовков в файле меньше, чем надо, !*! DeadMustdie, 19:24 , 08-Фев-05 (1)
    Хинт: всегда ли так называемые "заголовки" размещены
    на расстоянии 2*n байт от начала файла? Ибо приведённый
    кусок кода не найдёт нужную последовательность, если
    она расположена по адресу (2*n + 1).
    • Заголовков в файле меньше, чем надо, !*! victorddt, 08:26 , 09-Фев-05 (2)
      >Хинт: всегда ли так называемые "заголовки" размещены
      >на расстоянии 2*n байт от начала файла? Ибо приведённый
      >кусок кода не найдёт нужную последовательность, если
      >она расположена по адресу (2*n + 1).


      Я думал так:
      беру по каждые 2 байта и их проверяю на равенство FF D8. Или он тут берет больше, чем 2?

      Проверял
      sizeof(buffer) = 2
      strlen(buffer) = 13, 1, 0 - значения меняются. Может из-за этого?

      • Заголовков в файле меньше, чем надо, !*! DeadMustdie, 10:33 , 09-Фев-05 (3)
        >Я думал так:
        >беру по каждые 2 байта и их проверяю на равенство FF D8.
        >Или он тут берет больше, чем 2?
        >

        Пример (в хексах):
               0A FF D8 1E
        На первом шаге вышеприведённый алгоритм
        ухватит '0A FF', на втором - 'D8 1E'.
        Проверка на 'FF D8' никогда не сработает.

        >Проверял
        >sizeof(buffer) = 2
        >strlen(buffer) = 13, 1, 0 - значения меняются. Может из-за этого?

        А strlen()ить двоичные данные не слишком разумно.
        Можно и SIGSEGV в награду получить.

        • Заголовков в файле меньше, чем надо, !*! victorddt, 11:07 , 09-Фев-05 (4)

          >Пример (в хексах):
          >       0A FF D8 1E
          >На первом шаге вышеприведённый алгоритм
          >ухватит '0A FF', на втором - 'D8 1E'.
          >Проверка на 'FF D8' никогда не сработает.
          >
          >>Проверял
          >>sizeof(buffer) = 2
          >>strlen(buffer) = 13, 1, 0 - значения меняются. Может из-за этого?
          >
          >А strlen()ить двоичные данные не слишком разумно.
          >Можно и SIGSEGV в награду получить.


          Блин, так оно и было!
          Спасибо тебе большое :)




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру