Почему это int имеет неправильное значение? - PullRequest
0 голосов
/ 13 января 2012

Не уверен, как еще это поставить, но я начну с фрагмента кода и выведу:

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 быть неправильно ?

Ответы [ 3 ]

16 голосов
/ 13 января 2012

hex липкий, поэтому, если вы не сбросите его, cout продолжит выводить вещи в шестнадцатеричном формате.

Вы можете сбросить его, отправив std::dec в поток. В качестве альтернативы вы можете создать более продвинутый механизм, который будет хранить исходное состояние и восстанавливать его после слов.

11 голосов
/ 13 января 2012

cout << "Expiration: " << dec << (long)expires << endl; будет выводить десятичную дробь, в противном случае последняя настройка (шестнадцатеричная или десятичная) все равно будет действовать.

3 голосов
/ 13 января 2012

Поскольку вы никогда не переключаете cout обратно на десятичный вывод, все ваших выходов в шестнадцатеричном формате, даже выход cout << "Expiration: " << (long)expires << endl;.

...