2013-12-10 6 views
-2

Так что я следующий код:Размещение 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 ..... почему ....?

+0

Вы, кажется, не быть инициализации буфера. Почему нет? –

+0

Собственно, я только что понял, вы только инициализируете 'buffer [0]'. –

+0

@Ethan Вместо того, чтобы представлять этот худший код практики, может быть более продуктивным рассказать нам о реальной проблеме, которую вы пытаетесь решить. –

ответ

3

Вы не размещаете 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; 

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

+0

Всегда было моим пониманием, что в C вы можете делать такие вещи. Он просто перейдет к остальной части массива .... однако я компилирую с C++. Разница в C++? – Ethan

+1

Это было бы то же самое в C. Если вы написали 'int i = 10000000000UL', компилятор« отрезал »значение до размера, чтобы сохранить его внутри. Такие назначения никогда не будут перетекать в другую память. С помощью '(uint32_t &)' я говорю компилятору обрабатывать область памяти, которую 'buffer' указывает как' uint32_t', и таким образом он сможет сохранить значение, не сокращая его. – s3rius

-1

Вторая по последняя строка выводит нуль по совпадению - вы никогда ничего не храните в buffer. Вы устанавливаете buffer[0] на значение, которое не поместилось бы там, и остальное оставалось неинициализированным.

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

+0

Первый абзац не соответствует действительности. Он хранится в 'buffer [0]' и в 'cout', который он разыменовал' buffer', который дает ему первый элемент массива. Он печатает 0, потому что он назвал 'htol()', который переключает порядок байтов и вызывает более низкие 8 байтов (которые скопированы в 'buffer [0]') равными 0. – s3rius

Смежные вопросы