不知道还能怎么说,但我先说一个代码片段和输出。
uint32_t expires;
cout << "Expiration bytes: " << setfill('0') << hex
<< setw(2) << (unsigned short)rec[keyLen+4]
<< setw(2) << (unsigned short)rec[keyLen+5]
<< setw(2) << (unsigned short)rec[keyLen+6]
<< setw(2) << (unsigned short)rec[keyLen+7] << endl;
expires = ntohl(*(uint32_t*)&rec[keyLen+4]);
cout << "Expiration: " << (long)expires << endl;
cout << "Hex: " << hex << expires << endl;
输出:
Expiration bytes: 00000258
Expiration: 258
Hex: 258
我可以从程序的其他部分确认 检查和输出字节的十六进制表示法是符合预期的 而且这些确实是字节流中的字节(从另一个应用程序发送)。
现在,如果能让我更好地理解一下 expiration
只是持有一些废话,因为这意味着有一些严重的错误(可能涉及指针)。但是这个... 这很明显是把十六进制值当作十进制值来吐出来,这很简单 错的.
更加令人困惑的是,这在程序的另一个点上也能用。
fullSize = ntohs(*(uint16_t*)&buff[0]);
字节值为0x0114, fullSize
将包含276的值。
所以问题是,这到底是怎么回事?一个int怎么可能是 错的?
cout << "Expiration: " << dec << (long)expires << endl;
将输出小数,否则最后一个设置(hex
或 dec
)仍然有效。
hex
是粘性的,所以除非你重置它。cout
将继续输出十六进制的东西。
你可以通过发送 std::dec
到流中。或者你可以建立一个更先进的机制,存储原始状态并在事后恢复它。
由于你从未切换过 cout
回到十进制输出。都 的输出都是十六进制的,甚至连 cout << "Expiration: " << (long)expires << endl;
.