Преобразование Берроуза Уилера

#c #burrows-wheeler-transform

#c #берроуз-Уилер-преобразование

Вопрос:

для проекта мне нужно кодировать и декодировать общий файл с использованием bwt. Единственная проблема заключается в том, что у меня возникают проблемы с кодированием файлов, отличных от файла txt. Я действительно не знаю, почему, поэтому я надеюсь, что вы сможете мне помочь, вот код:

 int compare(const void *a, const void *b) {

    caratteri *ca = *(caratteri **) a;

    caratteri *cb = *(caratteri **) b;

    unsigned char *c1;

    unsigned char *c2;

    c1 = ca->first;

    c2 = cb->first;

    while (*c1 - *c2 == 0) {

        c1  ;

        c2  ;
    }

    return (*c1 - *c2);
}

caratteri **createStruct(unsigned char c[], caratteri car[], caratteri *ptr[], long size) {

    for (long i = 0; i < size; i  ) {

        ptr[i] = amp;car[i];

        car[i].first = amp;c[i];

        car[i].last = amp;c[(size - 1   i) % size];
    }

    return ptr;
}
caratteri **bwt(long size, FILE *file) {
    FILE *risultato;
    unsigned char *c = malloc(sizeof(unsigned char) * size);
    fread(c, sizeof(unsigned char), size, file);
    caratteri *car = malloc(sizeof(caratteri) * size);

    caratteri **pCaratteri = malloc(sizeof(caratteri *) * size);

    pCaratteri = createStruct(c, car, pCaratteri, size);

    qsort(pCaratteri, size, sizeof(pCaratteri), compare);

    risultato=fopen("risultato","wb");

    for(long i = 0; i < size; i  )

        fputc(*pCaratteri[i]->last,risultato);

    fclose(risultato);

    return pCaratteri;
}
 

основным классом является:

 int main() {
    FILE *file;
    file = fopen("thumbnail.jpg","rb");
    if (file == NULL) {
        printf("Errore di apertura file!");
        exit(2);
    }
    fseek(file, SEEK_SET, SEEK_END);
    long size = ftell(file) 1;
    rewind(file);
    caratteri **car = bwt(size, file);
    FILE *risultato;
    decryptbwt(risultato);
    return 0;
}
 

Опять же, я не знаю почему, но кодирование и декодирование отлично работают с текстовыми файлами, в то время как с другими расширениями они не работают. Вы знаете, почему? Кроме того, я новичок в этом мире, поэтому простите мои глупые ошибки, и это не полный код. Очевидно, что это всего лишь простая реализация, которую я сделал, избегая массивов суффиксов.

Комментарии:

1. » У меня возникают проблемы с кодированием файлов, отличных от файла txt «… какие файлы какого типа? Покажите пример ввода, объясните, что вы ожидаете, и объясните, что происходит вместо этого, т.Е. Что означает «не работает».

2. Алгоритм должен считывать общий файл, затем создавать повороты байтов внутри файла и, наконец, сортировать их лексикографически. Я пробовал использовать файлы pdf, png и jpg, отличные от файлов txt, но это работает только с файлами txt, в то время как с другими расширениями я получаю «неполные последовательности» при чтении байтов, и перестановки настолько запутаны.

3. @underscore_d В коде, т.Е. Я попробовал алгоритм с файлом jpg

4. используется FILE *fp = fopen(filename, "rb"); для открытия двоичного файла для чтения. Двоичные и текстовые файлы полностью отличаются от чтения и записи текстовых файлов. Например, строковые функции не будут работать. fgets не будет работать.

5. В любом случае, decryptbwt() отсутствует, так что это неполный вопрос.