Pengenalan:
Banyak protokol rangkaian memerlukan penyimpanan 64 -bit integer dalam "urutan bait rangkaian." Ini berbeza daripada susunan bait hos, yang berpotensi menyebabkan masalah keserasian. Nasib baik, untuk integer 32-bit, fungsi htonl digunakan secara meluas untuk menukar kepada susunan bait rangkaian. Pembangun sering mencari fungsi analog untuk integer 64-bit. Artikel ini meneroka ketersediaan fungsi sedemikian dan menyediakan pelaksanaan jika tidak tersedia.
Kewujudan Fungsi Standard:
Malangnya, tiada fungsi htonll standard dalam perpustakaan standard C atau mana-mana perpustakaan mudah alih yang diterima pakai secara meluas.
Pelaksanaan:
Jika tiada fungsi standard, kami boleh melaksanakan versi mudah alih kami sendiri. Berikut ialah dua pendekatan:
1. Runtime Byte-Swapping:
Pendekatan ini menentukan sama ada byte-swapping diperlukan dengan menyemak endianness pada runtime menggunakan htonl(1). Jika pertukaran bait diperlukan, kami menukar bahagian 32-bit integer 64-bit menggunakan htonl. Kod untuk pendekatan ini ialah:
<code class="c++">#define htonll(x) ((1==htonl(1)) ? (x) : ((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32))</code>
2. Compile-Time Byte-Swapping:
Jika anda mempunyai akses kepada pengkompil yang mentakrifkan makro prapemproses seperti __BIG_ENDIAN__, anda boleh menggunakannya untuk mengoptimumkan proses pertukaran bait pada masa penyusunan. Berikut ialah contoh:
<code class="c++">#if __BIG_ENDIAN__ # define htonll(x) (x) # define ntohll(x) (x) #else # define htonll(x) (((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32)) # define ntohll(x) (((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32)) #endif</code>
Kesimpulan:
Kesimpulannya, tiada fungsi htonll standard dalam C . Walau bagaimanapun, kami telah menyediakan pelaksanaan mudah alih yang menentukan endian pada masa jalan atau masa kompilasi, membenarkan penukaran integer 64-bit kepada susunan bait rangkaian.
Atas ialah kandungan terperinci Bagaimana untuk Menukar Integer 64-bit kepada Pesanan Rangkaian Byte dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!