为什么这个`int`的值不对?

问题描述 投票:0回答:3

不知道还能怎么说,但我先说一个代码片段和输出。

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怎么可能是 错的?

c++ hex posix byte
3个回答
11
投票

cout << "Expiration: " << dec << (long)expires << endl; 将输出小数,否则最后一个设置(hexdec)仍然有效。


16
投票

hex 是粘性的,所以除非你重置它。cout 将继续输出十六进制的东西。

你可以通过发送 std::dec 到流中。或者你可以建立一个更先进的机制,存储原始状态并在事后恢复它。


3
投票

由于你从未切换过 cout 回到十进制输出。 的输出都是十六进制的,甚至连 cout << "Expiration: " << (long)expires << endl;.

© www.soinside.com 2019 - 2024. All rights reserved.