Rozwiązanie zadania "CRC" #24
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "(deleted):zad3"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Proszę sprawdzić, że program jest w stanie zweryfikować swój output:
string
Hello_world
ma crc0xc50e
, który koduje Pan jako utf-16;tymczasem na wyjściu kodowania powinien pojawić się bytecode.
(Dlatego właśnie było założenie o tym, że znaki są tylko ASCII, każdy reprezentowalny jako 8-bitowa liczba)
Dla stringa "Hello_world" program zwraca CRC o wartości 0xC50E, co, mam nadzieję, udowadnia załączony obrazek. Do kodu dodałem tylko wyświetlenie ramki w postaci heksadecymalnej.
Postaram się też pozbyć wszelkich wątpliwości:
a) Kodowanie
Zakres ASCII, przynajmniej w Pythonie 3, obejmuje zaledwie liczby 0 - 127. Co za tym idzie, dla niektórych wiadomości ramka się mieściła w tym zakresie, ale dla reszty nie.
Przykładem tego jest bajt powyżej: C5 (16) = 197 (10)
Rozwiązaniem była zamiana kodowania na latin-1 co powiększyło zakres do 255.
b) Treść zadania
Z treści zrozumiałem, że funkcja kodująca po wprowadzeniu "wiadomosc" zwróci "wiadomoscBB" gdzie BB to są dwa bajty, każdy z nich w postaci ASCII 8-bitowej.
Tak jak wspomniałem w a), zakres ASCII okazał się niewystarczający, więc żeby zobaczyć naszą zakodowaną wiadomość w konsoli (niekoniecznie z ramką drukowalną!) posłużyłem się innym sposobem.
Jeśli mam wprowadzić jakieś zmiany lub coś wytłumaczyć, służę pomocą.
wiem, że algorytm dzielenia zwraca poprawną odpowiedź;-)
niemniej nikt nie powiedział w specyfikacji, że wiadomość po dołączeniu FCS ma być "czytelnym ciągiem znaków ASCII", albo że w ogóle ma być ciągiem znaków w jakimkolwiek kodowaniu. Że tak się dzieje (po konwersji do innego kodowania), to czysty zbieg okoliczności ;-)
Notabene przechowując fcs w takiej postaci narażamy się na ewentualne problemy, gdy ktoś postanowi kiedyś zmienić kodowanie (co miejmy jednak nadzieję, że nie nastąpi w najbliższej przyszłości ;).
tak naprawdę wyjście powinno być typu
bytearray
(albobytes
)przy sprawdzaniu fcs znowu nie możemy założyć, że dwa ostatnie bajty mieszczą się w ascii, więc musimy je obciąć:
Czytając jeszcze raz widzę, że treść zadania nie jest do końca poprawnie sformułowana.
Wprowadziłem zmiany do procesu kodowania i dekodowania. Liczę, że teraz jest tak jak miało być. Dodatkowo, program uruchamia się teraz bezpośrednio z terminala za pomocą flag. Więcej informacji w fladze -h (bez żadnej wyświetlą się one automatycznie).
na commicie
f807d32
:Teraz już naprawdę powinno działać.
ok, uwagi do kodu:
czy naprawdę trzeba było operować na stringach? fragmenty typu
str(hex(int(...)))
wskazują, że chyba jednak nie ;-)dlaczego nie użył Pan dzielenia wielomianów z poprzedniego zadania? Całe zadanie sprowadzałoby się do napisania funkcji która z ciągu znaków ascii wyprodukuje wielomian o współczynnikach w Z/2 i odwrotnie. + kodowanie ramki. Gdyby mnieć odpowiednio napisaną klasę
Polynomial
(przeciążającą__add__
,__mul__
,__pow__
i__mod__
), czyli to co mieli Państwo przygotować w Zadaniu 2 możnaby napisać:Pull request closed