2014-08-15 2 views
0

Я пытаюсь скопировать некоторые значения изКак скопировать некоторые биты в междунар в к полукокса буфера

uint8_t tx_buff_id[3]; У меня есть

sprintf(tx_buff_id, "%X", rx_dataframe.id);// rx_dataframe.id is H'0000005b 

Я получаю в моем буфере tx_buff_id[3] at [0] '5' [1] 'B' [2] '.' // Hex эквивалентном из них 0x35,0x42,0x00

Что я хочу в моем буфере tx_buff_id[3] at [0] '0' [1] '5' [2] 'B' // Hex эквивалент этих 0x30,0x35,0x42

Исходные значения отправки, подобные этому, и я не влияю на источник, иначе я мог бы получать значения в одинаковом формате.

+3

'Sprintf (tx_buff_id, "% 03X", rx_dataframe.id);' – joop

+0

как @joop сказано и сделать буфер больше, чтобы удерживать завершающий символ NULL и другие символы, если число является истинным 32 бит (всего 9 байтов). – egur

ответ

0

Если вы строите строку или, по крайней мере, используете функции форматирования строк, используйте переменную назначения char, а не uint8_t. Это не «копирование некоторых бит», это преобразование целого числа в строку.

Это звучит, как вы хотите

char tmp[4]; 

sprintf(tmp, "0%X", rx_dataframe.id); 

Это даст вам строку "05b", то есть он будет предварять символ '0', что вы говорите, вы хотите, прежде чем две цифры шестнадцатеричного числа.

Аргумент tmp должен быть длиной 4, так как sprintf() будет писать ограничитель строки. Ваш код не соблюдает это. Не знаете, где период ('.') исходит из того, что вы утверждаете, что видите.

+0

Извините, но, пожалуйста, снова просмотрите вопрос, я сделал редактирование – User

0

Вы можете сделать это с помощью простого цикла, как показано в примере ниже:

uint8_t* ptr = (uint8_t*)&rx_dataframe.id; 
uint8_t tx_buff_id[sizeof(rx_dataframe.id)]; 

// On a little-endian architecture 
for (int i=0; i<sizeof(rx_dataframe.id); i++) 
    tx_buff_id[i] = ptr[i]; 

// On a big-endian architecture 
for (int i=0; i<sizeof(rx_dataframe.id); i++) 
    tx_buff_id[i] = ptr[sizeof(rx_dataframe.id)-1-i]; 
Смежные вопросы