Итак, у меня есть следующий код:
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;
От второй до последней строки выводится 0, последняя строка — 16777216 ….. почему ….?
Вы на самом деле не ставите uint32_t
в массиве uint8_t
s. Вместо этого вы помещаете его в buffer[0]
, Поскольку длина намного больше, будет сохранен только самый младший 8 байт. И так как вы позвонили htonl(length)
самые младшие 8 байтов фактически равны 0 (по крайней мере, если ваша хост-система использует порядок байтов, отличный от сетевого — и это, похоже, имеет место здесь).
Если вы действительно хотите использовать первые четыре элемента 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;
Не то чтобы это была хорошая идея, хотя ..
От второй до последней строки совпадает ноль — вы никогда ничего не сохраняли в buffer
, Ты устанавливаешь buffer[0]
до значения, которое не подходит там и оставило остальное неинициализированным.
Последняя строка выводит 16,777,216, потому что ваша платформа имеет младший порядок и htonl
переключается на формат с прямым порядком байтов, поэтому ваш 0,0,0,1 становится 1,0,0,0. Это единица в 256 ^ 3 месте, и 1 * 256 ^ 3 = 16 777 216.