Bardzo często spotykamy "magiczne liczby". I nie chodzi tylko o fragmenty kodu, gdzie autor "zapomniał" użyć cokolwiek mówiącej stałej. Odgórnie, "magicznie" wybrane liczby to stały element formatów plików czy protokołów - pełnią one najczęściej rolę identyfikatorów. Przyjrzyjmy się najdziwniejszym, najbardziej szokującym i najciekawszym spośród "magicznych liczb".
Sam termin "magic number" ma swoje początki w systemie operacyjnym Unix w wersji 7 (rok 1979). Już w wersji szóstej Uniksa pierwsze 2 bajty programu wykonywalnego musiały mieć wartość 0x0107. W kolejnej wersji tego systemu wartość ta była podczas odczytywania pliku zapisywana w zmiennej o nazwie ux_mag. Zmienna ta dzięki dziwnej nazwie zyskała przydomek "magicznej liczby". Dla innych typów plików zmienna ta przyjmowała inne wartości. Jeżeli chodzi o systemy operacyjne to w linuksach nadal znajdziemy plik "magic.h" ;)
Tutaj można znaleźć oryginalny kod z pliku sys1.c Unixa wersji 7: http://www.google.com/codesearch/p?hl=en#miRTe8ZyR0o/Archive/PDP-11/Distributions/research/Henry_Spencer_v7/v7.tar.gz|118goTAkg2o/usr/sys/sys/sys1.c&q=%22ux_mag%22.
OK, to teraz najciekawsze magiczne stałe ;)
Wiele magicznych liczb nabiera sensu po zapisaniu ich w formacie heksadecymalnym i przeczytaniu, np.:
0x8BADF00D (ate bad food) i 0xDEADFA11 (dead fall) - kody błędów systemu iOS (obecnego m.in. w iPhone).
0xABADBABE (a bad babe) - używany przez Apple do oznaczania sektora bootowalnego.
0xCAFEBABE (cafe babe) - najbardziej znany chyba przykład ;) Nie tylko początek plików .class w Javie, ale też dla plików wykonywalnych w formacie Mach-O (np. MAC OS X takie wspiera)
0xCAFEDOOD (cafe dude) - koleś pojawia się kiedy skompresujemy binaria Javy z pomocą Pack200.
0xBADCAB1E (bad cable) - kod błędu połączenia z serwerem debugowania embedded Visual C++.
0xDEADBEEF (dead beef) - początek partycji dysku w Nintendo Gamecube. W Solaris tą wartością zaznaczana jest pamięć zwolniona przez system operacyjny.
0xDEADDEAD (dead dead) - kod "Blue Screen of Death" wywołanego na żądanie użytkownika lub przez debugger dołączony do jądra systemu.
0xD15EA5E (disease) - początek partycji dysku w Nintendo Wii.
0xD0CF11E0 (doc file 0) - od takich liczb zaczynają się wszystkie pliki w formatach Microsoft Office - doc, xls, ppt itd.
0xFEE1DEAD (feel dead) - jedna z magicznych wartości wykorzystywanych w Linuksie przy rebootowaniu systemu, zdefiniowana w "reboot.h".
0x19540119 - 19 stycznia 1954 to data urodzin twórcy Berkley Fast File System, Marshalla Kirk McKusicka.
0x89504E470D0A1A0A - tak długi nagłówek mają pliki PNG. Oprócz "PNG" w ASCII ciąg ten zawiera też kody najczęściej spotykanych znaków końca linii. Pozwala to wychwycić błędu transferu spowodowane np. wykorzystywaniem trybu ASCII zamiast binary przy przesyłaniu z użyciem FTP.
Jak widać bardzo dużo magicznych liczb związanych z byciem martwym ;) Są też magiczne liczby, które trzeba interpretować wyłącznie znaki ASCII:
MEOW - od takiego "miau" zaczyna się komunikat w protokole OBJREF (protokole marshallingu COM i DCOM).
MZ - od tych dwóch liter zaczyna się każdy plik EXE w systemach DOS i Windows. Mark Zbikowski był osobą, która projektowała format pliku wykonywalnego dla systemu DOS (nazywany np. na wikipedii DOS MX executable). Ciekawostka - w 2006 roku Mark obchodził okrągłą rocznicę 25 lat współpracy z Microsoft. Był wtedy najdłużej pracującą tam osobą, po Billu Gatesie i Steve Ballmerze.
PK - tak zaczyna się wiele plików w formacie ZIP, opracowanym przez Philipa Katza. Zaczynają się tak też pliki, które wykorzystują ZIP jako kompresor (np. docx)
Więcej:
http://en.wikipedia.org/wiki/Magic_number_%28programming%29
http://en.wikipedia.org/wiki/Hexspeak#Notable_magic_numbers
wtorek, 6 lipca 2010
Subskrybuj:
Komentarze do posta (Atom)
Brak komentarzy:
Prześlij komentarz