我正在尝试从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
源只发送这样的值,我对源没有任何影响,否则我会收到相同格式的值。
答案 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];