だから私は次のコードを持っています:
uint32_t length = 1;
uint8_t buffer[5];
buffer[0] = htonl(length);
std::cout << (uint32_t)*buffer << std::endl;
std::cout << htonl(length) << std::endl;
最後から 2 行目には 0 が出力され、最後の行には 16777216 が出力されます.....なぜ....?
実際にsuint32_t
の配列に入れているわけではありませんuint8_t
。代わりに、 に配置していbuffer[0]
ます。長さがはるかに大きいため、最下位の 8 バイトのみが格納されます。を呼び出しhtonl(length)
たので、実際には最下位の 8 バイトはすべて 0 です (少なくとも、ホスト システムがネットワークとは異なるバイト順を使用している場合は、これが当てはまるようです)。
実際に の最初の 4 つの要素を のbuffer
格納length
に使用したい場合は、それらを として再解釈するようコンパイラに指示する必要がありますuint32_t
。
uint32_t length = 1;
uint8_t buffer[5];
(uint32_t&)*buffer = htonl(length);
std::cout << (uint32_t)*buffer << std::endl;
std::cout << htonl(length) << std::endl;
ただし、それが良い考えであるというわけではありません..