Ordinea octetilor

Versiunea actuală a paginii nu a fost încă revizuită de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 13 noiembrie 2018; verificările necesită 39 de modificări .

În sistemele moderne de calcul și comunicații digitale, informațiile sunt de obicei reprezentate ca o secvență de octeți . În cazul în care numărul nu poate fi reprezentat printr-un octet, contează în ce ordine sunt scriși octeții în memoria computerului sau transmisi prin linii de comunicație. Adesea, alegerea ordinii octeților este arbitrară și determinată doar de convenții.

În general, pentru a reprezenta un număr M mai mare de 255 (aici  - numărul întreg maxim care poate fi scris într-un octet ), trebuie să folosiți mai mulți octeți (n). În acest caz, numărul M este scris în sistemul numeric pozițional în baza 256:

Mulțimea numerelor întregi , fiecare între 0 și 255, este succesiunea de octeți care formează M . În acest caz, se numește octetul mic și  - octetul înalt al numărului M.

Deoarece computerul nu se adresează biților individuali (aceștia pot fi obținuți doar prin câmpuri de biți), ordinea biților într-un octet este importantă numai în organizarea fizică a stocării și transmisiei datelor, poate diferi de la dispozitiv la dispozitiv și, de obicei, nu este importantă. necesare unui programator de aplicații.

Opțiuni de înregistrare

Comandă de la cel mai în vârstă la cel mai mic

Comandă de la cel mai în vârstă la cel mai tânăr ( engleză  big-endian  - de la capătul mare): . Această ordine este similară cu ordinea obișnuită de scriere (de exemplu , în cifre arabe ) „de la stânga la dreapta”, de exemplu, numărul o sută douăzeci și trei ar fi scris într-o astfel de ordine ca 123 . În aceeași ordine, se obișnuiește să se scrie octeți în literatura tehnică și educațională, cu excepția cazului în care este indicată în mod explicit o altă ordine.

Această ordine este standard pentru protocoalele TCP/IP , este utilizată în antetele pachetelor de date și în multe protocoale de nivel superior concepute pentru a fi utilizate peste TCP/IP. Prin urmare, ordinea octeților de la mare la cel scăzut este adesea numită „ordinea octeților de rețea” ( de exemplu, ordinea octeților  de rețea ). Această ordine de octeți este utilizată de procesoarele IBM 360 / 370/390, SPARC , Motorola 68000 (de unde și al treilea nume - Motorola byte order , ing.  Motorola byte order ).

Cu această ordine de octeți, este convenabil să comparați șirurile de caractere (le puteți compara cu câmpuri întregi - părți de o capacitate mai mare, fiecare dintre ele conține mai multe caractere simultan).

Ordinea octetilor de la mare la mic este folosită și în multe formate de fișiere  - de exemplu, PNG , FLV , EBML , JPEG .

Comandă de la cel mai mic la cel mai mare

Comandă de la cel mai mic la cel mai mare ( ing.  little-endian  - de la capătul mic):

Aceasta este inversul ordinii obișnuite de scriere a numerelor în cifre arabe , de exemplu, numărul o sută douăzeci și trei ar fi scris într-o astfel de ordine ca 321 . Cu alte cuvinte, această ordine este similară cu regula de scriere de la dreapta la stânga.

Această ordine de scriere este adoptată în memoria computerelor personale cu procesoare cu arhitectură x86 și, prin urmare, este uneori numită ordine de octeți Intel (după numele companiei care a creat arhitectura x86). Procesoarele x86 moderne vă permit să lucrați cu operanzi de unul, doi, patru și opt octeți. În această ordine de octeți, este foarte convenabil ca atunci când dimensiunea (numărul de octeți) operandului crește, valoarea primului său octet să rămână neschimbată: 3210 → 3210'0000. În ordine de la mare la minim, valoarea s-ar modifica, de exemplu: 0123 → 0000'0123;

În plus față de x86, această ordine de octeți este folosită în arhitecturile VAX (de unde un alt nume pentru engleză.  VAX byte order [1] ), DEC Alpha și multe altele.

De asemenea, ordinea „de la cel mai mic la cel mai mare” este folosită în tabelul de partiții USB , PCI , GUID , fiind recomandat de FidoNet . Dar, în general, convenția little-endian acceptă mai puține protocoale și formate de date multiplatforme decât big-endian .

Ordine comutabilă

Multe procesoare pot funcționa atât în ​​ordinea scăzută la înaltă și invers, cum ar fi ARM (implicit este little endian), PowerPC (cu excepția PowerPC 970 ), DEC Alpha , MIPS , PA-RISC și IA-64 . Ordinea octetilor este de obicei selectată de software în timpul inițializării sistemului de operare , dar poate fi selectată și prin jumperii hardware de pe placa de bază. În acest caz, este mai corect să vorbim de endianness la nivel de sistem de operare. Endianitatea comutabilă este uneori numită engl.  bi-endian .

Ordine mixtă

Ordinea de octeți mixtă (combinată, hibridă) ( în engleză  middle-endian) este uneori folosită atunci când se lucrează cu numere a căror lungime depășește cuvântul mașină . Numărul este reprezentat de o secvență de cuvinte mașină , care sunt scrise într-un format care este firesc pentru această arhitectură, dar cuvintele mașină în sine urmează în ordine inversă.

Procesoarele VAX și ARM folosesc o reprezentare mixtă pentru numere reale lungi.

Exemplu

Următorul este un exemplu care descrie plasarea unui număr de 4 octeți în memoria RAM a unui computer, care poate fi accesat atât ca cuvânt de 32 de biți, cât și octet cu octet.

Toate numerele sunt scrise în sistem numeric hexazecimal.

Număr: 0xA1B2C3D4
Performanţă
Comanda de la cel mai mic la cel mai mare (micul-endian)
Comanda de la cel mai mare la cel mai mic (big-endian)
Ordin adoptat în PDP-11 (PDP-endian)

Determinarea endianness

Ordinea octetilor (endianness) într-o anumită mașină poate fi determinată folosind programul C (testbyteorder.c):

#include <stdio.h> #include <stdint.h> int main () { uint16_t x = 0x0001 ; printf ( "%s-endian \n " , * (( uint8_t * ) & x ) ? "mic" : "mare" ); }

Rezultatele rulării pe o mașină big-endian ( SPARC ):

$ uname -m sparc64 $ gcc -o testbyteorder testbyteorder.c $ ./testbyteorder big-endian

Executați rezultatele pe o mașină little-endian ( x86 ):

$ uname -m i386 $ gcc -o testbyteorder testbyteorder.c $ ./testbyteorder little-endian

Numerele reale

Stocarea numerelor reale poate depinde și de endian. De exemplu, pe x86 , formatele IEEE 754 sunt folosite cu semn și exponent în octeți mari.

Unicode

Dacă Unicode este scris în format UTF-16 sau UTF-32 , atunci endianness este deja semnificativ. Una dintre modalitățile de a indica ordinea octeților în textele Unicode este prefixarea caracterului special BOM ( marca de ordine a octetilor , marca de ordine a octetilor , U+FEFF) - versiunea „inversată” a acestui caracter (U+FFFE) nu există și nu este permis în texte.

Caracterul U+FEFF este reprezentat în UTF-16 prin secvența de octeți 0xFE 0xFF (big-endian) sau 0xFF 0xFE (little-endian), iar în UTF-32 prin secvența de octeți 0x00 0x00 0xFE 0xFF (big-endian) sau 0xFF 0xFE 0x00 0x00 (micul -endian).

Probleme de compatibilitate și conversie

Scrierea unui număr de mai mulți octeți din memoria computerului într-un fișier sau transferul acestuia într-o rețea necesită convenții privind octetul care este trimis primul. Scrierea directă în ordinea în care octeții sunt localizați în celulele de memorie duce la probleme atât la transferul unei aplicații de la platformă la platformă, cât și la schimbul de date intersistem de rețea.

Pentru a converti între ordinea octeților de rețea , care este întotdeauna big-endian, și ordinea octeților gazdei , standardul POSIX oferă  funcțiile , , , : htonl()htons()ntohl()ntohs()

  • uint32_t htonl(uint32_t hostlong); - convertește o valoare nesemnată de 32 de biți din ordinea octeților locale în ordinea octeților de rețea;
  • uint16_t htons(uint16_t hostshort); - convertește o valoare nesemnată de 16 biți din ordinea octeților locale în ordinea octeților de rețea;
  • uint32_t ntohl(uint32_t netlong); - convertește o valoare nesemnată de 32 de biți din ordinea octeților de rețea în ordinea octeților locale;
  • uint16_t ntohs(uint16_t netshort); — convertește o valoare nesemnată de 16 biți din ordinea octeților de rețea în ordinea octeților locale.

Dacă ordinea actuală a octetilor și funcția de rețea se potrivesc, acestea vor funcționa ca „vide” - adică ordinea octeților nu se va modifica. Standardul permite, de asemenea, implementarea acestor funcții ca macrocomenzi.

Există multe limbi și biblioteci cu facilități pentru conversia la și din ambele ordine majore de octeți.

Nucleul Linux : , le16_to_cpu(), cpu_to_be32(), cpu_to_le16p()și așa mai departe;

Nucleu FreeBSD : , htobe16(), le32toh()și așa mai departe;

Erlang :

<< Număr : 32 / mare - fără semn - întreg , Medie : 64 / mare - float >> = Bucătă Mesaj = << Lungime : 32 / mic - unsigned - integer , MType : 16 / little - unsigned - integer , MessageBody >>

Python :

import struct Count , Average = struct . unpack ( ">Ld" , Chunk ) Mesaj = struct . pachet ( „<LH” , Lungime , MType ) + MessageBody

Perl :

( $Count , $Average ) = despachetează ( 'L>d>' , $Chunk ); $Message = pachet ( '(LS)<' , $Length , $MType ) . $MessageBody ; ( sau același : $Message = pachet ( 'Vv' , $Length , $MType ) . $ MessageBody ;)

aceste exemple pentru Erlang, Python, Perl conțin funcționalități identice.

Procesoarele Intel x86-64 au o instrucțiune BSWAP pentru a schimba ordinea octeților.

Etimologia numelui

Termenii big-endian și little-endian nu au fost inițial legați de informatică. Călătoriile lui Gulliver , o lucrare satirică a lui Jonathan Swift , descrie stările fictive ale lui Lilliputia și Blefuscu, care sunt în război unul cu celălalt de mulți ani din cauza unui dezacord cu privire la ce capăt ouăle fierte ar trebui să fie rupte . Cei care cred că trebuie să fie rupti de la capătul contondent sunt numiți Big-endians („capete tocite”) în lucrare.

Disputele dintre suporterii big-endian și little-endian în informatică sunt, de asemenea, adesea în natura așa-numitelor. „războaie religioase”. [2] Termenii big-endian și little-endian au fost inventați de Danny Cohen în 1980 în articolul său On Holy Wars and a Plea for Peace .  [3] [4]

Vezi și

Note

  1. pack() în Perl . Consultat la 20 decembrie 2010. Arhivat din original pe 13 decembrie 2010.
  2. Întrebări frecvente despre Endian de la DAV (link descendent) . Preluat la 3 august 2008. Arhivat din original la 10 noiembrie 2006. 
  3. Danny Cohen. Despre războaiele sfinte și o pledoarie pentru pace  (în engleză) (1 aprilie 1980). Data accesului: 24 ianuarie 2010. Arhivat din original la 15 februarie 2012.
  4. Tanenbaum E. Arhitectura computerului. - a 5-a ed. - Sankt Petersburg. : Peter, 2007. - 844 p. - S. 89.

Link -uri