Magic Numbers Hemligheten kodar som programmerare Dölj i din dator
Ända sedan den första personen skrev ut 5318008 på en räknare har nerdar gömt hemliga siffror inuti datorn och använt dem för att förhandla hemliga handslag mellan applikationer och filer. Idag tar vi en snabb titt på några av de mer underhållande exemplen.
Vad är Magic Numbers?
De flesta programmeringsspråk använder en 32-bitars heltalstyp för att representera vissa typer av data bakom kulisserna - internt lagras numret i RAM eller används av CPU som 32 och nollor, men i källkoden skulle det skrivas ut i antingen regelbundet decimalformat eller som hexadecimalt format, som använder siffrorna 0 till 9 och bokstäverna A till och med F.
När operativsystemet eller en applikation vill bestämma typen av en fil kan den se till början av filen för en särskild markör som betyder typ av fil. Till exempel kan en PDF-fil börja med hex-värdet 0x255044462D312E33, vilket motsvarar "% PDF-1.3" i ASCII-format, eller en ZIP-fil börjar med 0x504B, vilket motsvarar "PK", som kommer från det ursprungliga PKZip-verktyget. Genom att titta på den här "signaturen" kan en filtyp enkelt identifieras även utan någon annan metadata.
Kompilerade Java Class-filer börjar med CAFEBABELinux-verktyget "fil" kan användas från terminalen för att bestämma typen av en fil - det läser faktiskt de magiska talen från en fil som heter "magi".
När en applikation vill ringa en funktion kan den överföra värden till den funktionen med hjälp av standardtyper som heltal, som kan uttryckas i källkoden i hexadecimalt format. Detta gäller speciellt för konstanter, vilka är identifierare definierade med läsbar namn som AUTOSAVE_INTERVAL, men de kartlägger till verkliga heltal (eller andra typ) värden. Så istället för att en programmerare skriver ett värde som 60 varje gång de kallar funktionen i källkoden, kan de använda AUTOSAVE_INTERVAL-konstanten för bättre läsbarhet. (Konstanter känns vanligtvis lätt igen eftersom de är skrivna i alla stora bokstäver).
Alla dessa exempel kan falla under termen Magic Numbers, eftersom de kan behöva ett specifikt hexadecimalt tal för att en funktion eller filtyp ska fungera korrekt ... om värdet inte är korrekt fungerar det inte. Och när en programmerare vill ha lite kul kan de definiera dessa värden med hjälp av hexadecimala tal som stavar ut någonting på engelska, annars känd som hexspeak.
Roligt med magiska nummer: några anmärkningsvärda exempel
Varje AppleScript slutar med FADEDEADOm du snabbt tittar på Linux-källkoden ser du att systemrapporteringen _reboot () på Linux kräver en "magisk" variabel som ska överföras som motsvarar hexadecimalt tal 0xfee1dead. Om något försökte ringa den funktionen utan att passera det magiska värdet först, skulle det bara ge ett fel.
GUID (globalt unik identifierare) för en BIOS-startpartition i GPT-partitioneringsschemat är 21686148-6449-6E6F-744E-656564454649, som utgör ASCII-strängen "Hah! IdontNeedEFI", en hänvisning till det faktum att GPT normalt skulle användas i datorer som ersätter BIOS med UEFI, men det behöver inte nödvändigtvis vara.
Microsoft gömde sig famously 0x0B00B135 i sin Hyper-V virtuella maskin stödjande källkod som skickades till Linux, då ändrade de värdet till 0xB16B00B5 och slutligen bytte de till decimal innan det togs bort från källkoden helt och hållet.
Roligare exempel är:
- 0xbaaaaaad - Används av IOS-kraschloggning för att ange att en logg är en stapelbild av hela systemet.
- 0xbad22222 - Används av IOS-kraschloggning för att indikera att en VoIP-app har dödats av IOS eftersom den misshandlade.
- 0x8badf00d - (Ate Bad Food) som används av IOS-kraschloggar för att ange att ett program tog för lång tid att göra något och dödades av vakthunden timeout.
- 0xdeadfa11 - (Dead Fall) som används av IOS-kraschloggning när en app stängs av en användare.
- 0xDEADD00D - Används av Android för att indikera en VM-avbrott.
- 0xDEAD10CC (Dead Lock) som används av IOS-kraschloggning när ett program låser en resurs i bakgrunden.
- 0xBAADF00D (Dålig mat) som används av LocalAlloc-funktionen i Windows för debugging.
- 0xCAFED00D (Cafe dude) som används av Java's pack200 kompression.
- 0xCAFEBABE (Café babe) som används av Java som identifierare för sammanställda klassfiler
- 0x0D15EA5E (Disease) som används av Nintendo på Gamecube och Wii för att indikera en normal uppstart hände.
- 0x1BADB002 (1 dålig boot) som används av multiboot-specifikationen som ett magiskt nummer
- 0xDEADDEAD - används av Windows för att ange en manuellt initierad felsökningsolycka, annars känd som den Blå Dödsskärmen.
Det här är inte bara de där ute, men bara en kort lista med exempel som verkade roliga. Vet du mer? Berätta för oss i kommentarerna.
Se exempel på dig själv
Du kan se fler exempel genom att öppna en hex-redigerare och sedan öppna ett antal filtyper. Det finns gott om freeware hex redaktörer tillgängliga för Windows, OS X eller Linux - bara se till att du är försiktig när du installerar freeware för att inte bli smittad med crapware eller spionprogram.
Som ett tilläggsalternativ startar återställningsbilder för Android-telefoner som ClockworkMod med "ANDROID!" Om de läses i ASCII-format.
Notera: Gå inte på att ändra något medan du tittar runt. Hex redaktörer kan bryta saker!