已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。
15小时前关门了。
Improve this question
我必须以这种方式编写一个字符串:
char message[200];
uint32_t device_id = get_raw_device_id(); // returns an internal FICR register value
char some_string[50];
/* Some intermediary code to populate some_string and open an MQTT connection. */
int len = snprintf(message, sizeof(message),
"{\"device_id\": \"%08X\", \"Params\": \"%s\"}",
device_id, some_string);
当打印“消息”时,我总是得到:{“device_id”:“6501000A”,“Params”:“XXXXXXX”}。
下面是get_raw_device_id()的代码:
#define __IM volatile const /*! Defines 'read only' structure member permissions */
typedef struct {
....
__IM uint32_t DEVICEID[2]; /*!< (@ 0x00000060) Description collection: Device identifier */
....
} NRF_FICR_Type;
uint32_t get_raw_device_id()
{
return NRF_FICR->DEVICEID[1]; // Only getting one of the 32bit values for brevity
}
device_id应该是十六进制值0x 6501 C74 F。当我这样安排代码时,这是固定的:
char message[200];
char some_string[50];
/* Some intermediary code to populate some_string and open an MQTT connection. */
int len = snprintf(message, sizeof(message),
"{\"device_id\": \"%08X\", \"Params\": \"%s\"}",
get_raw_device_id(), some_string);
将函数调用移动到字符串组合行可以解决这个问题,但我不确定为什么会发生这种情况。
1条答案
按热度按时间b91juud31#
device_id
的值已从0x6501C74F
更改为0x6501000A
,这与其前2个字节已被0x0A
和0x00
覆盖一致。这可能来自缓冲区溢出,其中存储到some_string
中的字符串将超过数组的长度,并且尾随的换行符'\n'
和null终止符覆盖了device_id
的初始部分(如@the_busybee所评论的)。您应该研究代码中被省略的部分(总结为
/* Some intermediary code to populate some_string and open an MQTT connection. */
),以了解可能的缓冲区溢出。张贴此代码应该会得到更准确的答案。