Algorytm RLE

Justys21
2013-01-30 20:56
Justys21
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ę.

A co jest nie tak? - _13th_Dragon 2013-01-30 21:14

Pozostało 580 znaków

Justys21
2013-01-30 21:23
Justys21
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ą :/

No bo masz tu burdel nie z tej ziemi. - _13th_Dragon 2013-01-30 21:28
Fakt... a mógłbyś mi pomoc ? ;* - Justys21 2013-01-30 21:31
Przerób ten kod tak aby input.eof() był badany tylko jeden jedyny raz. Zapewniam cię że błąd zniknie. - _13th_Dragon 2013-01-30 21:34

Pozostało 580 znaków

2013-01-30 22:14

Rejestracja: 7 lat temu

Ostatnio: 7 lat temu

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 ;(((

Pozostało 580 znaków

2013-01-30 22:27

Rejestracja: 14 lat temu

Ostatnio: 1 dzień temu

0

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2013-01-30 22:31
Nie, otwieram z ios::binary, więc nie w tym błąd :/ - Justys21 2013-01-30 22:56

Pozostało 580 znaków

2013-01-31 02:00

Rejestracja: 7 lat temu

Ostatnio: 7 lat temu

0

Problem rozwiązany ;)

Wina typu zmienne n (brak unsigned) :D

edytowany 2x, ostatnio: Justys21, 2013-01-31 02:09
zmień na unsigned char - _13th_Dragon 2013-01-31 02:09

Pozostało 580 znaków

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