Algorytm RLE

0

Mam takie zadanie:

a) każde wystąpienie sekwencji w danych źródłowych zastępujemy tokenem:
przykład:
3 z 3
załóżmy, że n=124, a m=457,
wtedy sekwencję znaków „A” zakodujemy za pomocą 3 bajtowego tokenu:
A A 122, gdzie 122 oznacza kod ASCII znaku w trzecim bajcie
a sekwencję znaków „B” zakodujemy za pomocą dwóch 3 bajtowych tokenów:
B B 255 B B 198, gdzie255 oraz 198 oznaczają kody ASCII znaków na trzecich bajtach
jak widać za pomocą 3 bajtowego tokenu można zakodować sekwencję maksymalnie 257
znaków: znak znak n-2, gdzie n oznacza długość sekwencji
b) każdy pojedynczy znak jest przepisywany
przykład:
…AA…ACBB…BB…
w tym przypadku znak „C” zostanie przepisany:
… A A n-2 C B B k-2 …, gdzie n,k oznaczają długości sekwencji znaków „A” i „B” (przyjmijmy,
że są nie większe niż 257.

Zadanie niby łatwe, ale gdy testuję swój algorytm na prostych danych wszystko jest ok, lecz gdy "wyślę" do szyfrowania *.exe to coś już jest nie tak :/

Oto mój algorytm szyfrowania:

void szyfruj()
{
    char zn1, zn2;

    int n = 1;
    input.get(zn1);

    while(!input.eof())
    {
        input.get(zn2);

        if(n == 257 || zn1 != zn2 || input.eof())
        {
            if(n == 1)
                output << zn1;
            else
                output << zn1 << zn1 << char(n-2);

            zn1 = zn2;
            n = 1;
        }
        else
          n++;
    }
}

Proszę o pomoc, bo nie wiem co jest źle :/ Z góry dziękuję.

0

@_13th_Dragon bo kiedy następnie próbuje rozszyfrować poniższą funkcją:

void deszyfruj()
{
    char zn1, zn2;
    char n;
    bool can = true;

    input.get(zn1);

    while(true)
    {
        if(!input.eof())
          can = false;

        input.get(zn2);

        if(input.eof() && !can)
        {
            output << zn1;
        }
        else
          can = true;

        if(input.eof())
          break;


        if(zn1 != zn2 || input.eof())
        {
            output << zn1;
            zn1 = zn2;
        }

        else
        {
            input.get(n);

            for(int i = 0; i < (int)n+2; i++)
              output << zn1;

            input.get(zn1);
        }
    }
}

Wówczas pliki przed i po szyfrowaniu się nie zgadzają :/

0

Prościej już nie umiem ;d

void deszyfruj()
{
    char zn1, zn2;
    char n;

    input.get(zn1);

    while(!input.eof())
    {
        input.get(zn2);

        if(zn1 != zn2 || input.eof())
        {
            output << zn1;
            zn1 = zn2;
        }

        else
        {
            input.get(n);

            for(int i = 0; i < (int)n+2; i++)
              output << zn1;

            input.get(zn1);
        }
    }
}

Ale wciąż nie działa ;(((

0

A jak otwierasz input i output?
jeżeli bez ios::binary to teraz w otwieraniu błąd.

0

Problem rozwiązany ;)

Wina typu zmienne n (brak unsigned) :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1