Tavujärjestys

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 13. marraskuuta 2018 tarkistetusta versiosta . tarkastukset vaativat 39 muokkausta .

Nykyaikaisissa tietojenkäsittely- ja digitaalisissa viestintäjärjestelmissä tiedot esitetään yleensä tavujen sarjana . Mikäli numeroa ei voida esittää yhdellä tavulla, on merkitystä sillä, missä järjestyksessä tavut kirjoitetaan tietokoneen muistiin tai lähetetään tietoliikennelinjoja pitkin. Usein tavujärjestyksen valinta on mielivaltainen ja määräytyy vain konventionaalisesti.

Yleensä, jos haluat edustaa lukua M , joka on suurempi kuin 255 (tässä  - suurin kokonaisluku, joka voidaan kirjoittaa yhteen tavuun ), sinun on käytettävä useita tavuja (n). Tässä tapauksessa luku M kirjoitetaan paikkalukujärjestelmässä kantaan 256:

Joukko kokonaislukuja , kukin välillä 0 ja 255, on tavujono, joka muodostaa M :n . Tässä tapauksessa sitä kutsutaan matalaksi tavuksi ja  - luvun M korkeaksi tavuksi .

Koska tietokone ei osoita yksittäisiä bittejä (ne voidaan saada vain bittikenttien kautta ) , bittien järjestys tavussa on tärkeä vain tietojen tallennuksen ja siirron fyysisessä organisoinnissa, se voi vaihdella laitteittain, eikä yleensä ole jota sovellusohjelmoija tarvitsee.

Tallennusasetukset

Järjestä vanhimmasta nuorimpaan

Järjestä vanhimmasta nuorimpaan ( englanniksi  big-endian  - isosta päästä): . Tämä järjestys on samanlainen kuin tavallinen kirjoitusjärjestys (esimerkiksi arabialaisilla numeroilla ) "vasemmalta oikealle", esimerkiksi numero satakaksikymmentäkolme kirjoitettaisiin sellaisessa järjestyksessä kuin 123 . Samassa järjestyksessä on tapana kirjoittaa tavuja tekniseen ja opetuskirjallisuuteen, ellei muuta järjestystä ole erikseen mainittu.

Tämä järjestys on vakiona TCP/IP-protokollille , sitä käytetään datapakettien otsikoissa ja monissa korkeamman tason protokollissa, jotka on suunniteltu käytettäväksi TCP/IP:n yli. Siksi tavujen järjestystä korkeasta matalaan kutsutaan usein "verkkotavujärjestykseksi" ( eng.  network byte order ). Tätä tavujärjestystä käyttävät IBM 360 / 370/390, SPARC , Motorola 68000 -prosessorit (siis kolmas nimi - Motorola byte order , eng.  Motorola byte order ).

Tällä tavujärjestyksellä on kätevää verrata merkkijonoja (voit verrata niitä kokonaislukukenttiin - suurempikapasiteettisiin osiin, joista jokainen sisältää useita merkkejä kerralla).

Tavujärjestystä korkeasta matalaan käytetään myös monissa tiedostomuodoissa  - esimerkiksi PNG , FLV , EBML , JPEG .

Järjestä nuorimmasta vanhimpaan

Järjestä nuorimmasta vanhimpaan ( eng.  little-endian  - pienestä päästä):

Tämä on päinvastainen kuin tavallinen numeroiden kirjoittamisjärjestys arabialaisilla numeroilla , esimerkiksi numero satakaksikymmentäkolme kirjoitettaisiin sellaisessa järjestyksessä kuin 321 . Toisin sanoen tämä järjestys on samanlainen kuin oikealta vasemmalle -kirjoitussääntö.

Tämä kirjoitusjärjestys on otettu käyttöön henkilökohtaisten tietokoneiden muistissa, joissa on x86 - arkkitehtuuriprosessorit , ja siksi sitä kutsutaan joskus Intel - tavujärjestykseksi (x86-arkkitehtuurin luoneen yrityksen nimen mukaan). Nykyaikaisten x86-prosessorien avulla voit työskennellä yhden, kahden, neljän ja kahdeksan tavun operandien kanssa. Tässä tavujärjestyksessä on erittäin kätevää, että kun operandin koko (tavumäärä) kasvaa, sen ensimmäisen tavun arvo pysyy muuttumattomana: 3210 → 3210'0000. Arvo muuttuisi järjestyksessä korkeasta matalaksi, esimerkiksi: 0123 → 0000'0123;

x86:n lisäksi tätä tavujärjestystä käytetään VAX -arkkitehtuureissa (tämä toinen nimi englanniksi.  VAX byte order [1] ), DEC Alpha ja monet muut.

Myös USB- , PCI- , GUID-osiotaulukossa käytetään järjestystä "alhaisimmista korkeimpiin" , sitä suosittelee FidoNet . Mutta yleensä little-endian -käytäntö tukee vähemmän monialustaisia ​​protokollia ja tietomuotoja kuin big endian .

Vaihdettava järjestys

Monet prosessorit voivat toimia sekä matalasta korkeaan että päinvastoin, kuten ARM (oletus on little endian), PowerPC (paitsi PowerPC 970 ), DEC Alpha , MIPS , PA-RISC ja IA-64 . Tavujärjestys valitaan yleensä ohjelmistolla käyttöjärjestelmän alustuksen yhteydessä, mutta se voidaan valita myös emolevyn laitteiston hyppyjohdin. Tässä tapauksessa on oikeampaa puhua endianisuudesta käyttöjärjestelmän tasolla. Vaihdettavaa endianisuutta kutsutaan joskus engl.  bi-endian .

Sekatilaus

Sekalaista (yhdistetty, hybridi) tavujärjestystä ( englanniksi  keski-endian) käytetään joskus, kun työskennellään numeroiden kanssa, joiden pituus ylittää konesanan . Numeroa edustaa konesanojen sarja , jotka on kirjoitettu tälle arkkitehtuurille luonnollisessa muodossa, mutta itse konesanat seuraavat käänteisessä järjestyksessä.

VAX- ja ARM-prosessorit käyttävät sekoitettua esitystä pitkille reaaliluvuille.

Esimerkki

Seuraavassa on esimerkki, joka kuvaa 4-tavuisen numeron sijoittamista tietokoneen RAM-muistiin, jota voidaan käyttää sekä 32-bittisenä sanana että tavuna.

Kaikki luvut kirjoitetaan heksadesimaalilukujärjestelmässä.

Numero: 0xA1B2C3D4
Esitys
Tilaa nuorimmasta vanhimpaan (pikku-endian)
Tilaa vanhimmasta nuorimpaan (big-endian)
PDP-11:ssä hyväksytty määräys (PDP-endian)

Endianssin määrittäminen

Tietyn koneen tavujärjestys (endianness) voidaan määrittää C -ohjelmalla (testbyteorder.c):

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

Ajotulokset huippukoneella ( SPARC ):

$ uname -m sparc64 $ gcc -o testbyteorder testbyteorder.c $ ./testbyteorder suurpäämies

Suorita tulokset pikkukoneella ( x86 ):

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

Reaaliluvut

Reaalilukujen tallentaminen voi myös riippua endianisuudesta. Esimerkiksi x86 :ssa IEEE 754 -muotoja käytetään etumerkin ja eksponentin kanssa korkeissa tavuissa.

Unicode

Jos Unicode on kirjoitettu UTF-16- tai UTF-32- muodossa , niin endianisuus on jo merkittävä. Yksi tavoista ilmoittaa tavujärjestys Unicode-teksteissä on liittää etuliitteen erikoismerkki BOM ( tavujärjestysmerkki , tavujärjestysmerkki , U+FEFF) - tämän merkin "käänteistä" versiota (U+FFFE) ei ole olemassa. eikä se ole sallittu teksteissä.

U+FEFF-merkki esitetään UTF-16:ssa tavusekvenssillä 0xFE 0xFF (big-endian) tai 0xFF 0xFE (pieni-endian) ja UTF-32:ssa tavusekvenssillä 0x00 0x00 0xFE 0xFF (big-endian) tai 0xFF 0xFE 0x00 0x00 (pieni -endian).

Yhteensopivuus- ja muunnosongelmat

Monitavuisen luvun kirjoittaminen tietokoneen muistista tiedostoon tai sen siirtäminen verkon kautta edellyttää sopimuksia siitä, kumpi tavu lähetetään ensin. Suora kirjoittaminen siinä järjestyksessä, jossa tavut sijaitsevat muistisoluissa, johtaa ongelmiin sekä sovelluksen siirtämisessä alustalta toiselle että järjestelmien välisessä verkkotiedonvaihdossa.

POSIX-standardi tarjoaa  toiminnot , , , : verkon tavujärjestyksen , joka on aina suuri, ja isäntätavujärjestyksen  muuttamiseksi .htonl()htons()ntohl()ntohs()

  • uint32_t htonl(uint32_t hostlong); - muuntaa 32-bittisen etumerkittömän arvon paikallisesta tavujärjestyksestä verkon tavujärjestykseen;
  • uint16_t htons(uint16_t hostshort); - muuntaa 16-bittisen etumerkittömän arvon paikallisesta tavujärjestyksestä verkon tavujärjestykseen;
  • uint32_t ntohl(uint32_t netlong); - muuntaa 32-bittisen etumerkittömän arvon verkon tavujärjestyksestä paikalliseen tavujärjestykseen;
  • uint16_t ntohs(uint16_t netshort); — muuntaa 16-bittisen etumerkittömän arvon verkon tavujärjestyksestä paikalliseen tavujärjestykseen.

Jos nykyinen tavujärjestys ja verkkotoiminto täsmäävät, ne toimivat "tyhjinä" - eli tavujärjestys ei muutu. Standardi mahdollistaa myös näiden toimintojen toteuttamisen makroina.

On olemassa monia kieliä ja kirjastoja, joissa on mahdollisuudet muuntamiseen molemmille suurille tavujärjestyksille ja niistä.

Linux-ydin : , le16_to_cpu(), cpu_to_be32(), cpu_to_le16p()ja niin edelleen;

FreeBSD - ydin : htobe16(), le32toh(), ja niin edelleen;

Erlang :

<< Luku : 32 / iso - etumerkitön - kokonaisluku , keskiarvo : 64 / iso - kellua >> = Osa Viesti = << Pituus : 32 / pieni - etumerkitön - kokonaisluku , MType : 16 / little - unsigned - integer , MessageBody >>

Python :

tuonti struct Count , Average = struct . pura ( ">Ld" , Chunk ) Viesti = struct . pakkaus ( "<LH" , pituus , MType ) + MessageBody

Perl :

( $Count , $Average ) = pura ( 'L>d>' , $Chunk ); $Message = pakkaus ( '(LS)<' , $Length , $MType ) . $MessageBody ; ( tai sama : $Message = pakkaus ( 'Vv' , $Length , $MType ) . $ MessageBody ;)

nämä esimerkit Erlangille, Pythonille ja Perlille sisältävät identtiset toiminnot.

Intel x86-64 -suorittimissa on BSWAP-käsky muuttaa tavujärjestystä.

Nimen etymologia

Termit big-endian ja little-endian eivät alun perin liittyneet tietojenkäsittelytieteeseen. Jonathan Swiftin satiirinen teos Gulliver 's Travels kuvaa Lilliputian ja Blefuscun kuvitteellisia osavaltioita, jotka ovat olleet sodassa toistensa kanssa useita vuosia erimielisyyden johdosta, mistä päästä keitetyt munat tulisi rikkoa . Niitä, jotka uskovat, että heidät on murrettava tylpästä päästä, kutsutaan teoksessa Big-endianiksi ("tylpäiksi päiksi").

Tietojenkäsittelytieteen isojen ja pienten kannattajien väliset kiistat ovat myös usein luonteeltaan ns. "uskontosodat". [2] Termit big-endian ja little-endian loi Danny Cohen vuonna 1980 artikkelissaan On Holy Wars and a Plea for Peace .  [3] [4]

Katso myös

Muistiinpanot

  1. pack() Perlissä . Haettu 20. joulukuuta 2010. Arkistoitu alkuperäisestä 13. joulukuuta 2010.
  2. DAV:n Endian FAQ (downlink) . Haettu 3. elokuuta 2008. Arkistoitu alkuperäisestä 10. marraskuuta 2006. 
  3. Danny Cohen. On Holy Wars and a Plea for Peace  (englanniksi) (1. huhtikuuta 1980). Käyttöpäivä: 24. tammikuuta 2010. Arkistoitu alkuperäisestä 15. helmikuuta 2012.
  4. Tanenbaum E. Tietokonearkkitehtuuri. - 5. painos - Pietari. : Peter, 2007. - 844 s. - S. 89.

Linkit