Scrierea de cod, independent de ordinea octet, în c

comandă octet

Acest termen se referă la modul în care stochează și utilizează octeți de sistem: ordine de la cel mai vechi la cel mai mic (de înregistrare începe cu cel mai semnificativ octet și se termină cu cel mai mic, endian mare), ordinea de la cei mai tineri la cea mai veche (înregistrarea datelor începe cu capetele mai tineri și mai în vârstă, puțin endian).

Depozitarea de octeți în memoria

Tabelul 1. Depozitare bytes big-endian (Big-endian)

Notă tabelul anterior - numerele sunt în ordine inversă. Pentru amintindu ordinea de următoarea regulă utilă: octetul scăzută este scris mai întâi (ordinul „de la cei mai tineri la cea mai veche“ - little-endian), octetul ridicat este scris mai întâi (ordinul „big-endian“ - big-endian).

Registre și ordine octet

Pentru Byte este importantă numai atunci când este necesar să se rupă secvența de multi-octet și scrie octeții în locații de memorie succesive. Cu toate acestea, în cazul în care există un registru de 32 de biți, care deține valoarea pe 32 de biți, atunci nu există nici un punct în a vorbi despre plasarea comenzii de octeți în memorie. Înregistrare nu este sensibil la ordinea de „big-endian“ sau „de la cel mai tânăr în vârstă“; înregistra numai magazine cu valoare de 32 de biți. Bitul cel mai din dreapta este cel mai puțin semnificativ, este un bit stânga senior.

Importanța endianness

Ordinea de octet este un atribut al sistemului, care determină dacă numere întregi sunt reprezentate de la stânga la dreapta sau de la dreapta la stânga. În multe programatori cred că lumea de astăzi de mașini virtuale și procesoare GHz ce ar trebui să ia în considerare problema abordată în acest articol? Din păcate, este necesar să se ia în considerare ordinea de octet de fiecare dată când un hardware sau software. Și, în general, nu există nici o regulă universală cu privire la modul de utilizare a comanda octet.

Toate procesoarele trebuie să fie proiectate cu orice ordine „de la cel mai tânăr la cel mai vechi“ sau „big-endian“. De exemplu, o familie de procesoare Intel® 80x86 și clonele lor sunt folosite „din cea mai tânără în vârstă“, în timp ce procesoarele Sun SPARC, Motorola 68K, și PowerPC utilizați comanda „din vechile celei mai tinere.“

Înregistrarea memoriei ordinea octet este o mare problemă în tranzit printr-o rețea. Încă o dată, că dacă trimiteți numărul creat în aceeași ordine octet de înregistrare, pe un computer care utilizează ordinea opusă scrierii, există o problemă. Situația este complicată și mai mult în cazul în care comanda nu este cunoscută înregistrarea de bytes pe calculatorul la distanță.

Exemplul 1 prezintă consecința programării exclud diferențele în direcția de octet de scriere.

Exemplul 1. Programarea exclude diferențele în direcția de octet de scriere
Exemplul 2. ieșire HexDump -C pe computer cu comanda „de la o vârstă mai mică la un“
Exemplul 3. Concluzie comandă HexDump-C din ordinul de înregistrare „de la cel mai tânăr la cel mai vechi“

Efectul de stocare de ordinul de octeți în memorie pentru codul

Diferența în ordinea octet nu afectează întotdeauna rezultatul operațiunilor. În cazul în care efectuează operațiuni la nivel de bit, sau schimbare la nivel de bit valori întregi, atunci nu iau în considerare ordinea octeților din memorie. Computer organizează mai multe octeți, astfel încât baitul cel mai puțin semnificativ este întotdeauna cel mai mic, cel mai semnificativ octet este întotdeauna un senior.

Acum, imaginați-vă că această linie ar trebui să fie înregistrate în fișierul folosind scriere () tipul de metodă. Am pus indicatorul la m și setați numărul de octeți pentru a scrie la dosar (în acest caz, patru). write () Metoda se ocupă de octet cu octet și le scrie într-un fișier care începe cu m și se termină NEWLINE.

Deci, am demonstrat că ordinea octet nu afectează reprezentarea siruri de caractere în C.

probleme de ordine Byte. atunci când utilizați o distribuție, care depinde de ordinea specifică octet. Un exemplu de o astfel de situație este prezentată în exemplul 4. dar rețineți că există mai multe tipuri diferite de reduceri care pot cauza probleme.

Exemplul 4. Forțarea endian

Care va fi valoarea lui x. Să ne uităm la ce face codul. Am creat o matrice de doi octeți, și apoi converti la un tip de scurt. Folosind o matrice, de fapt, ne forțează sistemul să utilizeze o anumită ordine octet; să vedem modul în care sistemul se va ocupa de aceste două octeți.

Dacă este utilizată abordarea „de la junior la senior“, 0 și 1 sunt interpretate în sens invers și va fi reprezentat ca 0,1. Deoarece ridicat octetul 0 și cel mai puțin semnificativ octet 1, valoarea x este egal cu 1.

Pe de altă parte, în sistemul cu ordinea de „big-endian“ byte semnificativ este 1, iar valoarea lui x este egal cu 256.

Determinarea endianness în timpul execuției

O modalitate de a determina ordinea octeților din sistem - este de a verifica locația în memoria o constantă predefinită. Să ne amintim că unitățile de cazare (1) de tip întreg număr de 32 de biți va fi citit - 00 00 00 01 pentru a comanda „big-endian“ și 01 00 00 00 Comanda „de la cel mai mic la cel mai“. Privind la primul octet al acestei constante poate specifica ordinea de octeți într-o anumită platformă, și apoi să ia măsurile cele mai eficiente în această situație.

Exemplul 5 examinează primul octet al unui întreg i pentru a determina este 0 sau 1. Dacă este 1, platforma actuală utilizează octeți în modul de memorie „de ordinul mic la mare“, iar dacă 0 - atunci când modul este „big-endian “.

Exemplul 5. Determinarea endian

Un alt mod de a determina ordinea octeților este utilizarea de indicii pentru octeți de caractere, inclusiv tipul int și verificați apoi primul octet - este 0 sau 1. Exemplul 6 ilustrează această metodă.

Exemplul 6. Indici de caractere

comandă octet de rețea

Pentru Byte „din vechile celei mai tinere,“ așa cum este utilizat în protocolul TCP / IP, numit uneori ordinea de octet de rețea. Chiar dacă computerele din rețea folosind procedura „de la cei mai tineri la cele mai vechi,“ valorile întregi multi-octet pentru transmiterea prin rețea care urmează să fie convertită în rețeaua de ordine octet, și apoi, din nou, convertit înapoi în ordine „de la cel mai tânăr la cel mai vechi,“ de pe computerul care primește.

În cazul în care stiva rulează pe un procesor care utilizează ordinea de octet „de la cel mai mic la cel mai vechi“, el trebuie să rearanja în octeți fiecare valori mai mulți octeți ale nivelurilor de la pozițiile TCP / IP. În cazul în care stiva se execută în modul de octet „de la cel mai mare la cel mai mic“, atunci nu există nici un motiv de îngrijorare. A trebuit să stiva de portabilitate (ruleaza pe CPU de ambele tipuri), el ar trebui să fie în măsură să decidă cu privire la necesitatea de a comite bytes de reordonare la momentul compilarii.

Pentru a pune în aplicare o astfel de reordonare prize furnizează un set de macro-uri pentru conversia unei secvențe de octeți în funcție de stocarea lor la gazdă, și conversia bytes atunci când transferul acestora dintr-o gazdă pentru octet de rețea, așa cum se arată mai jos.

htons () rearanjeaza bytes o valoare de 16 biți fără semn al ordinului utilizat în procesorul curent, pentru octet de rețea. Numele Macro poate fi descifrat ca „gazdă a rețelei scurt“ ( „în scopul de a converti numărul nesemnat scurt pentru octet de rețea“). htonl () rearanjeaza bytes pe 32 de biți fără semn valoare de ordinul utilizat în procesorul curent, pentru octet de rețea. Numele Macro poate fi descifrat ca „gazdă a rețelei de lungă“ ( „în scopul de a converti numărul lung fără semn, pentru octet de rețea“). ntohs () rearanjeaza bytes valoare unsigned 16 biți de comandă octet rețea pentru octet utilizat pe procesorul curent. nume macro pot fi decodate ca „rețea să găzduiască scurt“ ( „în afara ordinii de rețea pentru ca procesorul utilizat, un număr de 16 biți“). ntohl () rearanjeaza bytes 32 byte valoare fără semn dintr-o rețea, în scopul de ordine octet utilizat pe procesorul curent. Numele macro poate fi decodificate ca o „rețea pentru a găzdui lung“ ( „în afara ordinii de rețea, în scopul de a procesorului numărul de 32 de biți folosit“).

Să considerăm un program din Exemplul 7.

Exemplul 7: Program în C

Acest program prezintă modul în care variabila x de tip valoare lungă depozitarea 112A380 (hexazecimal) stocate.

Atunci când acest program este executat pe un procesor care utilizează ordinea de octet „de la cel mai mic la cel mai vechi“, se afișează informațiile așa cum este descris în Exemplul 8.

Exemplul 8. Rezultatul unui program pe modul CPU „de la cel mai mic la cel mai“

Exemplul 9 prezintă rezultatele aceluiași program pe un procesor cu modul „big-endian“.

Exemplul 9. Rezultatul unui program pe modul CPU „big-endian“

Inversarea ordinea de octet

Acum scrie un program, rezultatele care sunt independente de ordinul octet. Trebuie să vă asigurați că datele din dosar sunt înregistrate în ordinea corectă atunci când scrieți la fișierul sau de a citi date de pe acesta. De asemenea, trebuie evitată și steaguri compilare condiționată în codul de program pentru a oferi posibilitatea de a determina automat endianness utilizat în calculator specific.

Crearea unui set de funcții care inversează automat ordinea de octet a unui parametru dat, în funcție de ordinea de octet de pe computer.

Mai întâi trebuie să se ocupe cu parametrul e de tip scurt. împărțind-doi octeți și apoi „lipici“ le în ordine inversă. Așa cum este prezentat în exemplul 10 de mai jos, funcția returnează valoarea inversă tip variabilă scurtă, dacă procesorul folosește comanda octet „de la junior la senior“. În caz contrar, funcția ar lăsa neschimbată valoarea variabilei s.

Exemplul 10 Metoda 1: Folosind o schimbare pic și lipire biți

Funcția este convertit peremennayayu de tip scurt mai jos. să-l prezinte ca o serie de caractere și apoi creează o nouă matrice, care este un revers al primului, în cazul în care procesorul utilizează modul „de la cel mai mic la cel mai vechi.“

Exemplul 11. Metoda 2: Utilizarea indicii pentru matrice de caractere

Ne întoarcem acum la un int.

Exemplul 12 Metoda 1: Folosind o deplasare bit și byte tip bonding int

Acest lucru mai mult sau mai puțin corespunde cu ceea ce am folosit pentru a face o schimbare în ordine inversă de tip scurt. dar timp de patru octeți, nu două.

Exemplul 13. Metoda 2: Folosind o matrice de caractere de indicii pentru tipul int

Același lucru pe care am făcut-o pentru inversarea unei variabile de tip scurt. dar patru octeți procesate aici.

În mod similar, puteți schimba la big-endian la un flotor, tipuri lungi, duble, și altele, dar luarea în considerare a acestor aspecte este dincolo de domeniul de aplicare al acestui articol.

concluzie

În general, nu există nici un avantaj special în utilizarea unui anumit ordin octet. Ambele comenzile sunt comune și sunt folosite în multe arhitectura de calculator. Procesoare modul de operare „de la cel mai tânăr în vârstă“, folosit pe majoritatea calculatoarelor personale.

Probleme cu ordinea de octet nu afectează variabilele care sunt stocate într-un singur octet, ca „bytes“ este considerat a fi unitatea de bază de stocare a informațiilor în memorie. Pe de altă parte, variabile multi-byte depind de ordinea de octet. trebuie avut în vedere la crearea cererii.

Obțineți produse și tehnologii

  • software-ul de încercare IBM. versiuni de încercare de dezvoltatori de software, care pot fi descărcate de pe developerWorks. (EN)