Не уверен, как еще это поставить, но я начну с фрагмента кода и выведу:
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 быть неправильно ?