如何将int的一些位复制到char缓冲区中

时间:2014-08-15 11:38:59

标签: c microcontroller

我正在尝试从uint32_t to my uint8_t.

复制一些值

我有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] '.' //等效于0x35,0x42,0x00

的十六进制

我在缓冲区中想要的是tx_buff_id[3] at [0] '0' [1] '5' [2] 'B' //等效于这些0x30,0x35,0x42

的十六进制

源只发送这样的值,我对源没有任何影响,否则我会收到相同格式的值。

2 个答案:

答案 0 :(得分:0)

如果您要构建字符串,或者至少使用字符串格式化函数,请使用char目标变量,而不是uint8_t。这不是"复制一些比特",这是将整数转换为字符串。

这听起来像你想要的

char tmp[4];

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

这将为您提供字符串"05b",即它将在十六进制数字的两位数之前添加您想要的字符'0'

tmp数组的长度必须为4,因为sprintf()将写入字符串终结符。你的代码不尊重这个。不确定您声称看到的句号('.')来自何处。

答案 1 :(得分: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];