Saturday 26 August 2017

Big Endian Little Endian Binära Alternativ


Jag försöker förbättra min förståelse för STFS-filformatet genom att använda ett program för att läsa alla olika bitar av information. Genom att använda en webbplats med en referens av vilka förskjutningar som innehåller vilken information, skrev jag en del kod som har en binärläsare gå igenom filen och placera värdena i rätt variabler. Problemet är att alla data är SUPPOSED för att vara Big Endian, och allt läsaren läser är Little Endian. Så, vad är det bästa sättet att gå om att fixa detta? Kan jag skapa en mimiklass av binärläsare som returnerar en omvänd rad bitar. Finns det något jag kan ändra i klassförekomsten som får den att läsas i stor endian så jag behöver inte skriva om allt någon hjälp uppskattas. redigera: Jag försökte lägga till Encoding. BigEndianUnicode som en parameter, men den läser fortfarande lite endian. Enligt min åsikt vill du vara försiktig med att göra detta. Anledningen till att man skulle vilja konvertera från BigEndian till LittleEndian är om de byte som läses är i BigEndian och OS-beräkningen mot dem fungerar i LittleEndian. C är inte ett språk enda språk längre. Med portar som Mono och andra Microsoft-plattformar som Windows Phone 78, Xbox 360Xbox One, Windwos CE, Windows 8 Mobile, Linux med MONO, Apple med MONO, etc. Det är ganska möjligt att operativplattformen kan vara i BigEndian, där Skulle du skryta dig själv om du konverterade koden utan att göra några kontroller. BitConverter har redan ett fält på det som heter IsLittleEndian. Du kan använda det här för att avgöra om operativmiljön är i LittleEndian eller inte. Då kan du göra omkastningen villkorligt. Som sådan skrev jag faktiskt bara några byteutvidgningar istället för att göra en stor klass: Så föreställ dig det här exemplet kod: svarat 6 feb 14 kl 7:39 Ditt svar 2017 Stack Exchange, Inc När du överför binära heltal över ett nätverk är det viktigt att se till att att sändnings - och mottagningssystemen använder samma format eller att en omvandling görs. Om en Big Endian-dator skickade ovanstående binära nummer till en Little Endian-dator utan omvandling, skulle den tolkas som 513. För att undvika problem i ett heterogent nätverk omvandlas binära tal till Network Standard Format (Big Endian) före överföring. Funktionerna: htons Host till Network Short htonl Host till Network Long kan användas för att konvertera binär data till standard standardformat. Historisk notering: Namnen Big Endian och Little Endian kommer från Swifts roman Gullivers Travels. I denna historia var lilliputianerna uppdelade i de stora endianerna och de små endianerna baserat på vilken ände ett kokat ägg de trodde skulle öppnas. Jag har försökt att leta efter men har inte kunnat hitta mycket om binär bokstav och endianhet. Är binära bokstäver liten endian, big-endian eller något annat (till exempel matchande målplattformen) Som ett exempel, vad är decimalvärdet på 0b0111. Är det 7 Plattformspecifik Något annat Rediger: Jag valde ett dåligt värde på 7 eftersom det representeras inom en byte. Frågan har blivit tillräckligt besvarad trots detta faktum. En del bakgrund: I grund och botten försöker jag ta reda på vad värdet av de minst signifikanta bitarna är och maskerar det med binära bokstäver som ett bra sätt att gå. men bara om det finns någon garanti för endianhet. frågade dec 18 14 kl 16:21 Cubic: Naturligtvis har decimal bokstavar endianhet. That39s varför 7x3 är 21 och inte 12. Varje beställd sekvens av siffror, oavsett basen har en endianhet. Eftersom ordern kan stiga upp eller ned, är det naturligtvis big-endian och little endian. (quotiddle-endianquot är de kusliga 3412 oordnade sekvenserna) ndash MSalters Dec 18 14 kl 17:44 Endianness exponeras aldrig direkt i koden om du inte verkligen försöker få det ut (till exempel med pekare). 0b0111 är 7, det är samma regler som hex, skrivning betyder inte 0x77AA på vissa plattformar eftersom det skulle vara absurt. Var skulle de extra 0s som saknas gå i alla fall skulle de bli vadderade på framsidan, så gick hela grejen om, eller skulle de få tillsats efter att jag inte har någon aning om vad någon skulle förvänta sig om så var fallet. Poängen är att C inte gör några antaganden om maskinens endianhet, om du skriver kod med primitiva och de bokstäver det ger, kommer beteendet att vara detsamma från maskin till maskin (om du inte börjar kringgå typsystemet, vilket du kan behöver göra) För att adressera din uppdatering: numret blir så du skriver ut det. Bitarna kommer inte att omordnas eller någon sådan sak, den viktigaste biten är till vänster och den minst signifikanta biten är till höger. Det verkar finnas ett missförstånd här om vilken endianhet är. Endianhet hänvisar till hur byte beställs i minnet och hur de måste tolkas. Om jag gav dig siffran 4172 och sa om det här är fyra tusen ett hundra sjuttiofem, vad är endianen du inte kan ge ett svar, eftersom frågan inte är meningsfull. (man kan hävda att den största siffran till vänster betyder stor endian, men Id är inte övertygad om att detta är giltigt). Det här är bara ett nummer, det finns inga byte att tolka, det finns inga minnesadresser. Om man antar 4 byte heltalsrepresentation är de byte som motsvarar den: så, med tanke på någon av dem och berättade detta är datorns interna representation av 4172 du kan bestämma om den är liten eller stor endian. Så nu överväga din binära bokstav 0b0111 dessa 4 bitar representerar en nybble och kan lagras som antingen Men du behöver inte bry dig eftersom det också hanteras av hårdvaran, dikterar språket att kompilatorn läser från vänster till höger, viktigaste biten till minst signifikant bit Endianhet handlar inte om enskilda bitar. Med tanke på att en byte är 8 bitar, om jag ger dig 0b00000111 och säger är den här lilla eller stora endianen, kan du inte säga att du bara har en byte. Endianitet omordnar inte bitar i en byte, hänvisar till omorganiseringen av hela byte (såvida inte självklart du har en bit byte). Du behöver inte bryr dig om vad din dator använder internt. 0b0111 sparar dig bara tiden från att behöva skriva saker som utan att behöva kommentera förklaring av betydelsen av numret. Jag vill påpeka att vid en tillräckligt låg nivå av programmering kan du inte undvika endianness eftersom specifikationerna för vad du än genomför, uppmanar deras ingångar eller utgångar att vara i littlebigwhatever endian. Det inkluderar nätverksprotokoll, kryptografiska algoritmer och så vidare. Bara för att du inte gör dessa saker betyder inte att de inte finns, och endianheten läcker ut ur det trevliga bekväma typsystemet i dessa situationer. Så quottoo smart för din egen goodquot del verkar obefogad. ndash Thomas dec 19 14 at 2:37 RyanHaining Använda htons från din kommentar: Det är lätt att implementera utan att göra några antaganden om endianness: uint16t htons (uint16t x) Det gör vissa antaganden om representation av uint16t. men endianhet är inte en av dessa antaganden, och åtminstone clang optimerar detta mycket bra. Jag håller med kommentaren att folk i allmänhet ska skriva kod som inte gör antaganden om endianhet, det är bara inte nödvändigt. ndash hvd dec 19 14 kl 8:55 Alla heltal bokstäver, inklusive binära, tolkas på samma sätt som vi normalt läser siffror (vänster mest siffra är mest signifikanta). C-standarden garanterar samma tolkning av bokstäver utan att behöva oroa dig för den specifika miljö du är på. Således behöver du inte oroa sig för endianen i detta sammanhang. Ditt exempel på 0b0111 är alltid lika med sju. C-standarden använder inte termer av endianhet med avseende på antal bokstäver. Snarare beskriver det helt enkelt att bokstäverna har en konsekvent tolkning, och att tolkningen är den du förväntar dig. C Standard - Integer Literals - 2.14.2 - stycke 1 Ett heltals bokstavligt tal är en sekvens av siffror som inte har någon period eller exponentdel, med valfri separering av enkla citat som ignoreras vid bestämning av dess värde. Ett heltal bokstavligt kan ha ett prefix som anger dess bas och ett suffix som anger dess typ. Den lexiskt första siffran i sekvensen av siffror är den mest signifikanta. Ett binärt heltal bokstavligt (bas två) börjar med 0b eller 0B och består av en sekvens av binära siffror. Ett oktalt heltal bokstavligt (bas åtta) börjar med siffran 0 och består av en sekvens av oktala siffror. Ett decimaltalstal bokstavligt (bas tio) börjar med en annan siffra än 0 och består av en sekvens av decimalsiffror. Ett hexadecimalt heltal bokstavligt (bas sexton) börjar med 0x eller 0X och består av en sekvens av hexadecimala siffror, som inkluderar decimalerna och bokstäverna a till och f till A med F med decimala värden tio till femton. Exempel: Antalet tolv kan skrivas 12, 014, 0XC eller 0b1100. Bokstäverna 1048576, 1048576, 0X100000, 0x100000 och 0004000000 har alla samma värde. slutet exempel Wikipedia beskriver vilken endianhet är och använder vårt nummersystem som ett exempel för att förstå big endian. Termerna endian och endianness refererar till konventionen som används för att tolka byte som utgör ett datord ord när dessa byte lagras i datorminnet. Big-endian-system lagrar den viktigaste byte av ett ord i den minsta adressen och den minst signifikanta byten lagras i den största adressen (se även Mest betydande bit). Little-endian system, däremot, lagra minst signifikanta byte i den minsta adressen. Ett exempel på endianhet är att tänka på hur ett decimaltal skrivs och läses i platsvärdesnotation. Om man antar ett skrivsystem där siffrorna skrivs åt vänster till höger är den vänstra läget analogt med den minsta adressen på minnet som används och i högst läge den största. Till exempel är talet ett hundra tjugo tre skrivna 1 2 3, med hundratals plats vänster mest. Den som läser detta nummer vet också att den vänstra siffran har störst platsvärde. Detta är ett exempel på en big-end-konvention som följs i det dagliga livet. I det här sammanhanget överväger vi en siffra av ett heltal bokstavligt att vara en byte av ett ord, och ordet för att vara den bokstavliga själv. Också anses den vänstra karaktären i en bokstav vara den minsta adressen. Med den bokstavliga 1234. siffrorna en, två, tre och fyra är bytes av ett ord, och 1234 är ordet. Med binär bokstav 0b0111. siffrorna noll, en, en och en är bytes av ett ord, och ordet är 0111. Denna övervägning tillåter oss att förstå endianhet i C-språkets sammanhang och visar att heltal bokstäver liknar big-endian. cmast Minsta adress vänster först. Självklart använder vi vanligtvis inte termen endianhet för antal strängar alls, och bara för layouten i minnet. Så man kan antingen säga att termen quotendiannessquot inte alls gäller bokstäver eller att de alltid är bigendian. Att säga att bokstäver är alltid små endian är definitivt fel. ndash-koderInChaos dec 18 14 kl 17:22 Du saknar skillnaden mellan endianitet som skrivet i källkoden och endianen som representeras i objektkoden. Svaret för var och en är otroligt: ​​källkods bokstäver är bigendian eftersom det är hur människor läser dem, i objektkod de är skrivna men målet läser dem. Eftersom en byte per definition är den minsta minnesaccessenheten, tror jag inte att det skulle vara möjligt att till och med tillskriva en endianhet till någon intern representation av bitar i en byte - det enda sättet att upptäcka endianhet för större antal (vare sig avsiktligt eller överraskande ) genom att komma åt dem från lagring i bitvis och byte är per definition den minsta tillgängliga lagringsenheten. svarat dec 18 14 kl 17:58 Hurkyl precis. Du kan inte berätta om maskinregistren är bigendian eller inte, för att de aldrig utsätts för det - det finns ingen anledning alls att avslöja någon endianness men bigendianness i register, eftersom hela punkten för littlendian var kompatibilitet med 8-bitars databussar med soda-halm till extern lagring eller enheter. ndash jthill Dec 18 14 kl 18:23 CC-talen bryr sig inte om endianhet av multi-byte heltal. CC-kompilatörer gör. Kompilatörer analyserar din källkod och genererar maskinkod för den specifika målplattformen. Samlaren lagrar i allmänhet heltal bokstäver på samma sätt som det lagrar ett heltal så att mål-CPU-instruktionerna direkt stöder läsning och skrivning i minnet. Kompilatorn tar hand om skillnaderna mellan målplattformar så att du inte behöver. Den enda gången du behöver oroa dig för endianness är när du delar binära värden med andra system som har olika bytebeställningar. Då skulle du läsa binär data i byte med byte och ordna byte i minnet i rätt ordning för system som din kod körs på. svarade dec 18 14 kl 17:22 TheronWGenaux: Haha, den här måste ha varit kul att felsöka Ja, x86-processorerna som standard för att simulera den oanpassade läsningen, som fungerar (om än långsamt) samma kod på en annan processor kommer att generera ett bussfel. Det här är roligt när du kodar och testar på x86 och sedan distribuerar till en annan (t. ex. inbäddad) CPU. ndash psmears dec 19 14 kl 18:40 Du kanske vill tänka på C eller C eller något annat språk som i själva verket lite endian (tänk på hur bitwise operatörerna arbetar). Om den underliggande HW är stor endian, säkerställer kompilatorn att data lagras i big endian (ditto för annan endianhet) men dina bitvisa operationer fungerar som om data är lite endian. Det som är viktigt att komma ihåg är att uppgifterna är i liten endian vad gäller språket. Endianitetsrelaterade problem uppstår när du sänder data från en typ till den andra. Så länge du inte gör det är du bra. Jag ifrågasattes om uttalandet CC-språk som i grunden lite endian, som sådant ger jag ett exempel som många vet hur det fungerar men bra här går jag. Utgång på ett litet endiansystem: Utgång på ett stort endiansystem: Så, om du inte känner till processorns endianhet. var kommer allt ut direkt i det lilla endiansystemet Således säger jag att CC-språket är i grunden litet endianskt. svarat dec 18 14 kl 18:17 Kommentarer är inte för längre diskussion denna konversation har flyttats till chatt. ndash bluefeet 9830 dec 19 14 på 1:25 Man kan skriva en liknande kontroll på ett monteringsspråk eller något annat språk som har pekare. Så den här koden visar bara att quotlittle-endian är mer naturlig än big-endianquot, detta gäller inte specifikt för CC. Dessutom har detta absolut ingenting att göra om binära bokstäver i frågan. ndash anatolyg 21 dec 14 kl 10:35

No comments:

Post a Comment