Помещение uint32_t в массив uint8_t

Итак, у меня есть следующий код:

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 ….. почему ….?

-2

Решение

Вы на самом деле не ставите uint32_t в массиве uint8_ts. Вместо этого вы помещаете его в 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;

Не то чтобы это была хорошая идея, хотя ..

3

Другие решения

От второй до последней строки совпадает ноль — вы никогда ничего не сохраняли в buffer, Ты устанавливаешь buffer[0] до значения, которое не подходит там и оставило остальное неинициализированным.

Последняя строка выводит 16,777,216, потому что ваша платформа имеет младший порядок и htonl переключается на формат с прямым порядком байтов, поэтому ваш 0,0,0,1 становится 1,0,0,0. Это единица в 256 ^ 3 месте, и 1 * 256 ^ 3 = 16 777 216.

-1

По вопросам рекламы [email protected]