#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()
отсутствует, так что это неполный вопрос.