GNU/Linux >> Znalost Linux >  >> Linux

Podpora Big Endian a Little Endian pro řazení bajtů

Na obou platformách máte

pro short (16bit):htons() a ntohs()

pro long (32bit):htonl() a ntohl()

Chybějící htonll() a ntohll() pro long long (64bit) lze snadno sestavit z těchto dvou. Viz například tato implementace.

Aktualizace-0:

U výše uvedeného příkladu Simon Richter v komentáři zmiňuje, že to nemusí nutně fungovat. Důvodem je:Kompilátor může někde v použitých svazcích zavést další bajty. Aby se to vyřešilo, musí být odbory sbaleny. To může vést ke ztrátě výkonu.

Takže zde je další bezpečný přístup k sestavení *ll funkce:https://stackoverflow.com/a/955980/694576

Aktualizace-0.1:

Z komentáře bames53 se přikláním k závěru, že první výše uvedený příklad by neměl být použit s C++, ale pouze s C.

Aktualizace-1:

Pro dosažení funkčnosti *ll funguje na Linuxu, tento přístup může být 'nejlepší'.


Nejedná se o stejná jména, ale existují stejné funkce.

EDIT:Archivovaný odkaz -> https://web.archive.org/web/20151207075029/http://msdn.microsoft.com/en-us/library/a3140177(v=vs.80).aspx

_byteswap_uint64, _byteswap_ulong, _byteswap_ushort


htons a htonl (a podobná makra) jsou dobré, pokud trváte na tom, že se budete zabývat bajtovým sexem.

Mnohem lepší je však tento problém obejít tím, že svá data vypíšete v ASCII nebo podobném. Zabere to trochu více místa a po síti se to přenáší trochu pomaleji, ale ta jednoduchost a zabezpečení do budoucna za to stojí.

Další možností je číselně rozebrat vaše int a short. Takže vy &0xff a dělení 256 opakovaně. To poskytuje jednotný formát na všech architekturách. Ale ASCII má stále výhodu, protože se s ním snadněji ladí.


Linux
  1. Bash pro průvodce smyčkou a příklady

  2. Tip pro profesionály:Smyčky For, While a Until

  3. Getopt, Getopts nebo ruční analýza – co použít, když chci podporovat krátké i dlouhé možnosti?

  1. Jak používám Ansible a anacron pro automatizaci

  2. RedHat a SUSE oznámily zrušení podpory pro OpenLDAP

  3. Jak velké (v bitech) je Unixové UID?

  1. Tipy a triky pro curl a wget

  2. Nahradit řádek jiným obsahem pomocí Sed And Parallel pro velký soubor?

  3. Linux – Obecná podpora Linuxu pro Ipv6 Připraven?