Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menukar Integer 64-bit kepada Pesanan Rangkaian Byte dalam C?

Bagaimana untuk Menukar Integer 64-bit kepada Pesanan Rangkaian Byte dalam C?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-31 16:09:01701semak imbas

How to Convert 64-bit Integers to Network Byte Order in C  ?

htonl untuk Integer 64-bit dalam C : Panduan Komprehensif

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) &amp; 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) &amp; 0xFFFFFFFF) << 32) | htonl((x) >> 32))
# define ntohll(x) (((uint64_t)ntohl((x) &amp; 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn