Di kedua platform yang Anda miliki
untuk short
(16bit):htons()
dan ntohs()
untuk long
(32bit):htonl()
dan ntohl()
htonll()
yang hilang dan ntohll()
untuk long long
(64bit) dapat dengan mudah dibangun dari keduanya. Lihat implementasi ini misalnya.
Pembaruan-0:
Untuk contoh yang ditautkan di atas, Simon Richter menyebutkan dalam komentar, bahwa itu belum tentu berhasil. Alasan untuk ini adalah:Kompiler mungkin memasukkan byte tambahan di suatu tempat di serikat pekerja yang digunakan. Untuk menyiasatinya, serikat pekerja perlu dikemas. Yang terakhir ini dapat menyebabkan penurunan performa.
Jadi inilah pendekatan gagal-aman lainnya untuk membuat *ll
fungsi:https://stackoverflow.com/a/955980/694576
Perbarui-0.1:
Dari komentar bames53, saya cenderung menyimpulkan bahwa contoh pertama yang ditautkan di atas tidak boleh digunakan dengan C++, tetapi hanya dengan C.
Pembaruan-1:
Untuk mencapai fungsionalitas dari *ll
fungsi di Linux pendekatan ini mungkin yang 'terbaik'.
Bukan nama yang sama, tetapi fungsi yang sama memang ada.
EDIT:Tautan yang Diarsipkan -> https://web.archive.org/web/20151207075029/http://msdn.microsoft.com/en-us/library/a3140177(v=vs.80).aspx
_byteswap_uint64, _byteswap_ulong, _byteswap_upendek
htons dan htonl (dan makro serupa) bagus jika Anda bersikeras berurusan dengan seks byte.
Namun, jauh lebih baik untuk menghindari masalah ini dengan mengeluarkan data Anda dalam ASCII atau yang serupa. Dibutuhkan sedikit lebih banyak ruang, dan mentransmisikan melalui jaringan sedikit lebih lambat, tetapi kesederhanaan dan kesiapsiagaan masa depan sangat berharga.
Pilihan lainnya adalah memisahkan int dan short Anda secara numerik. Jadi Anda &0xff dan bagi dengan 256 berulang kali. Ini memberikan format tunggal pada semua arsitektur. Namun ASCII masih memiliki kelebihan karena lebih mudah untuk di-debug.