Ordinea de octeți
Ordinea L 'byte (cunoscută și sub numele de big-endian, little-endian sau middle-endian conform diferitelor metode), în calcul , indică diferite moduri utilizate de computere pentru a stoca în memorie date de dimensiuni mai mari la octeți (de exemplu, Word , dword , qword ).
Istorie
Endianitatea (ordinea de octeți) a unui computer depinde în esență de arhitectura hardware utilizată. De exemplu, Intel și Digital folosesc formatul endian mic, în timp ce Motorola , IBM și Sun folosesc formatul endian mare. Formatul datelor conținute în antetele protocoalelor de rețea este, de asemenea, mare; alte exemple de utilizare a acestor două formate diferite sunt cele ale magistralei PCI , care este puțin endiană, sau cea a magistralei VME, care este mare endiană.
Etimologie
Termenii big-endian și little-endian derivă, după cum spune Jonathan Swift în romanul Călătoriile lui Gulliver , din numele a două populații care au trăit pe insulele fabuloase Lilliput și Blefuscu și care intraseră în rivalitate pentru modul în care au deschis ouăle.: ruperea vârfului sau a fundului: în Lilliput, prin edict al împăratului al cărui fiu s-a tăiat odată prin deschiderea unui ou din capătul mai mare, i s-a ordonat să deschidă ouăle din capătul mai scurt (micii endieni); Oponenții care doreau să păstreze tradiția spargerii ouălor din capătul mai mare (marii endieni) s-au refugiat la Blefuscu. Din cauza acestei diferențe și a legitimității sale imperiale, izbucnise un război sângeros între cele două insule.
Descriere
Această diferențiere nu se referă la poziția biților din octet, caz în care vorbim de ordinea biților și nici pozițiile caracterelor dintr-un șir . În schimb, este important în interpretarea (decodarea) șirurilor de caractere multi-octet, de exemplu codarea UTF-16 a standardului unicode .
Clasificare
Diferența dintre cele două sisteme este dată de ordinea în care sunt stocate sau transmise octeții care alcătuiesc datele care trebuie stocate:
- big-endian : stocarea / transmisia pornind de la cel mai semnificativ octet (cel mai mare capăt) și terminând cu cel mai puțin semnificativ, este utilizat de procesoarele Motorola ;
- little endian : stocarea / transmisia pornind de la cel mai puțin semnificativ octet (cel mai mic capăt) și terminând cu cel mai semnificativ, este utilizat de procesoarele Intel ;
Notă: termenul endian generează deseori confuzie; pentru a vă aminti corect diferența, amintiți-vă că endian se referă la sfârșitul de la care datele inițiale încep să fie procesate (scrise / citite în / din memorie sau transmise / primite pe / de pe canalul de comunicație), nu în ce scop se termină ultima dată în memorie sau pe canalul de comunicare.
Ordinea big-endian a fost aleasă ca ordine standard în multe protocoale folosite pe Internet , prin urmare se numește și ordine de octeți de rețea . În schimb, ordinea octeților gazdei este ordinea nativă a gazdei
Exemple
În cazul unui WORD (16 biți), numărul hexazecimal 0x0123 este stocat ca:
Little endian Big endian + ---- + ---- + + ---- + ---- + | 0x23 | 0x01 | | 0x01 | 0x23 | + ---- + ---- + + ---- + ---- + octet: 0 1 0 1
În cazul unui DWORD (32 biți), numărul hexazecimal 0x01234567 va fi stocat ca:
Little endian Big endian + ---- + ---- + ---- + ---- + + ---- + ---- + ---- + ---- + | 0x67 | 0x45 | 0x23 | 0x01 | | 0x01 | 0x23 | 0x45 | 0x67 | + ---- + ---- + ---- + ---- + + ---- + ---- + ---- + ---- + octet: 0 1 2 3 0 1 2 3
(În exemple, valoarea 0x01 este cel mai semnificativ octet)
Funcții pentru conversie
Următoarele funcții pot fi utilizate pentru a converti de la endian puțin la mare și invers (conversia este perfect simetrică).
Implementare în C
Conversia cuvântului
unsigned short int Endian_Word_Conversion ( cuvânt scurt int nesemnat ) {
return (( cuvânt >> 8 ) & 0x00FF ) | (( cuvânt << 8 ) & 0xFF00 ) ;
}
Conversie cu dublu cuvânt
unsigned long int Endian_DWord_Conversion ( nesemnat long int dword ) {
return (( dword >> 24 ) & 0x000000FF ) | (( dword >> 8 ) & 0x0000FF00 ) | (( dword << 8 ) & 0x00FF0000 ) | (( dword << 24 ) & 0xFF000000 );
}
Implementare în C #
UInt32
public uint Endian_UInt32_Conversion ( valoare uint ) {
return (( valoare >> 24 ) & 0 x000000FF ) | (( valoare >> 8 ) & 0 x0000FF00 ) | (( valoare << 8 ) & 0 x00FF0000 ) | (( valoare << 24 ) & 0 xFF000000 );
}
UInt64
publice ulong Endian_UInt64_Conversion (valoare ulong) {
return (( valoare >> 56 ) & 0 x00000000000000FF ) | (( valoare >> 40 ) și 0 x000000000000FF00 ) | (( valoare >> 24 ) & 0 x0000000000FF0000 ) | (( valoare >> 8 ) & 0 x00000000FF000000 ) | (( valoare << 8 ) și 0 x000000FF00000000 )
| (( valoare << 24 ) & 0 x0000FF00000000 ) | (( valoare << 40 ) & 0 x00FF0000000000 ) | (( valoare << 56 ) & 0 xFF000000000000 );
}
Folosiți pentru formatele de dată
Termenii sunt uneori folosiți și pentru a indica formatul datei:
- zz / ll / aaaa: data europeană este puțin endiană
- aaaa / ll / zz: datele Big-endian sunt utilizate în Japonia și ISO 8601
- mm / zz / aaaa: data utilizată în SUA este endian mijlocie
Notă
Elemente conexe
Alte proiecte
-
Wikimedia Commons conține imagini sau alte fișiere în ordine de octeți