-2

だから私は次のコードを持っています:

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 が出力されます.....なぜ....?

4

2 に答える 2

3

実際に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;

ただし、それが良い考えであるというわけではありません..

于 2013-12-10T00:46:42.010 に答える