wtorek, 6 lipca 2010

Magiczne liczby

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

Brak komentarzy:

Prześlij komentarz