【发布时间】:2021-09-04 07:43:21
【问题描述】:
我必须将 uint32_t 数字复制到 char[] 缓冲区的中间。 情况是这样的:
char buf[100];
uint8_t pos = 52; // position in buffer to which I want to copy my uint32_t number
uint32_t seconds = 23456; // the actual number
我尝试像这样使用 memcpy:
memcpy(&buf[position], &seconds, sizeof(seconds));
但是在缓冲区中我得到了一些奇怪的字符,而不是我想要的数字
我也尝试过使用字节移位
int shiftby = 32;
for (int i = 0; i < 8; i++)
{
buf[position++] = (seconds >> (shiftby -= 4)) & 0xF;
}
有没有其他方法可以解决这个问题?
【问题讨论】:
-
您的预期输出是什么?您的
memcpy代码看起来不错。 -
您的循环在正确的轨道上,但存在一些问题 - 例如,
buf[position]是一个 byte(8 位),而您正在编写 nibbles i>(4 位)。 -
请提供complete minimal reproducible example,包括用于查看“一些奇怪字符”的测试代码以及确切的实际结果与预期结果。
-
将数字放入
char数组不会将数字的数字作为字符。如果你想要格式化的数字,你需要使用sprintf()。 -
您的示例代码表明
uint32_t实际上是一个 容器 用于 8 位 BCD 表示或您尝试以十六进制表示值。如果是这种情况,你需要清楚,否则大多数人会假设你想要一个十进制表示,在这种情况下,输出的位数将是可变的,多达 10 个,所以它引出了字段宽度、填充的问题,左/右对齐等。简而言之,您的要求尚未明确。预期输出字符串的一些示例可能有助于澄清。