2015-07-20 2 views
0
char data[40] = {'\0'}; 
uint8_t Plevel= 0xA5; 
uint8_t status = 0x21; 
uint16_t ID = 0xABCD; 

snprintf(data, 5, "%"PRIu8"%"PRIu8"%"PRIu16"",Plevel, status, ID); 
printf("data:%s\n",data); 

выхода: 1653данных uint8_t преобразование типа/uint16_t на символ [] с помощью snprintf

http://www.asciitohex.com/ Я использую, чтобы увидеть преобразования, но не мог получить, почему он выводит 1653.

Может кто-нибудь, пожалуйста, объясните конверсии?

ответ

3

0xA5 выходы 165. 0x21 выходы 33. 0xABCD выходы 43981. Это дает 1653343981. Но размер выходной строки ограничен 5 (включая терминатор nul), и вы получаете 1653.

+0

спасибо :) это не часть моего вопроса, но я был бы счастлив, если бы вы могли ответить на него. Моя цель - хранить uin8_t как 1 байт (я пытаюсь выполнить сериализацию данных). Нужен ли мне конвертер hex в ASCII или я могу его хранить по-другому через snprintf вместо использования «PRIu8»? – sven

+0

Тип 'uint8_t' *** *** хранится как один байт. Не имеет значения, назначаете ли вы значение как hex '0xA5' или десятичную' 165'. Оба они представляют одно и то же значение. В одном байте не хранится '0xA5' и' 165' буквально: он содержит битовый шаблон, представляющий значение. –

+0

Я имел в виду, чтобы передать 0xA5 в «данные», ему требуется 3 байта (длина строки) на snprintf. но я хочу сохранить его как 1 символ вместо 3. Могу ли я использовать что-либо еще, кроме% «PRIu8» для snprintf? или мне нужен конвертер hex в ASCII? – sven

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