24Aug
Ända sedan den första personen skrev ut 5318008 på en räknare har nördar gömt hemliga siffror inuti datorn och använt dem för att förhandla hemliga handslag mellan program 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 iantingen vanlig decimalformat eller som hexadecimalt format som använder siffrorna 0 till 9 och bokstäverna A till F.
När operativsystemet eller en applikation vill bestämma typen av en fil kan den se till början av filenför en särskild markör som betyder typ av fil. Exempelvis kan en PDF-fil börja med hex-värdet 0x255044462D312E33, vilket är lika med "% 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.
Linux-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 kallas "magi".
När en applikation villatt ringa en funktion kan den överföra värden till den funktionen med hjälp av standardtyper som heltal, vilket kan uttryckas i källkoden i hexadecimalt format. Detta gäller speciellt för konstanter, vilka är identifierare definierade med läsbara 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 ut 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.
Nöje med magiska nummer: Några anmärkningsvärda exempel
Om du tar en snabb titt på Linux-källkoden ser du att systemrapporteringen _reboot() på Linux kräver en "magisk" variabel som ska passerassom 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, vilket utgör ASCII-strängen "Hah! IdontNeedEFI", en hänvisning till det faktum att GPT normalt skulle varaanvänds i datorer som ersätter BIOS med UEFI, men det behöver inte nödvändigtvis vara.
Microsoft famously gömde 0x0B00B135 i sin Hyper-V virtuella maskin som stödjer källkoden 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.
Fler roliga exempel är:
- 0xbaaaaaad - Används av IOS-kraschloggning för att indikera 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 vakthållarens 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-komprimering.
- 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 att en vanlig 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 indikera en manuellt initierad felsökningsolycka, annars känd som den Blå Dödsskärmen.
Dessa är inte de enda där ute, förstås, 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 spyware.
Som ett tillagd exempel startar återställningsbilder för Android-telefoner som ClockworkMod med "ANDROID!" Om de läses i ASCII-format.
Obs! ändrar inte något medan du tittar runt. Hex redaktörer kan bryta saker!