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 fabuloasele insule 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 edictul î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, un război sângeros a izbucnit î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 . Pe de altă parte, 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 începând de la octetul cel mai puțin semnificativ (cel mai mic capăt) și terminând cu cel mai semnificativ, este utilizat de procesoarele Intel ;
Notă: termenul endian generează adesea confuzie; pentru a vă aminti corect diferența, amintiți-vă că endian se referă la sfârșitul de la care datele originale î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 folosită în SUA este mijlocie
Notă
Elemente conexe
Alte proiecte
- Wikimedia Commons conține imagini sau alte fișiere în ordine de octeți