以编程方式填充 uint8_t 数组
Posted
技术标签:
【中文标题】以编程方式填充 uint8_t 数组【英文标题】:Programmatically populate a uint8_t array 【发布时间】:2019-11-18 17:10:13 【问题描述】:我有一个 uint8_t 数组,应该如下所示。
uint8_t code[1000] = 0x66, 0xba, 0xf8, 0x03
现在我不能在该数组中硬编码值,我需要从char buffer[300]
中一一插入。 char buffer[300]
的内容是一个空格分隔的十六进制值字符串"66 ba f8 03"
我写的代码是-
char* token = strtok(buffer, " ");
// Keep printing tokens while one of the
// delimiters present in str[].
int pc = 0;
while (token != NULL)
code[pc] = token; // This part is wrong. I need to cast it properly
token = strtok(NULL, " ");
pc++;
如何将字符串值转换为uint8_t
值?
【问题讨论】:
我会使用strtol
。这带有各种错误检查,您必须确保您的结果至少也适合uint8_t
。
code[pc]
是单个uint8_t
值,token
是一个指针 指向uint8_t
值(即uint8_t *
)。
为什么不改用char* code[1000]
?
如果您不反对 brutal 解决方案,(uint8_t) buffer[i]
已经是您想要的。
@Someprogrammerdude 是的,这正是我想不出解决方案的原因
【参考方案1】:
使用strtol
转换十六进制数字字符串的示例代码。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
int main(void)
char buffer[300] = "66 ba f8 03";
uint8_t code[1000];
long val;
char *endptr;
char* token = strtok(buffer, " ");
// Keep printing tokens while one of the
// delimiters present in str[].
int pc = 0;
while (token != NULL)
/* convert as a base16 number */
val = strtol(token, &endptr, 16);
/* The character following the number should be the end of the string as the input string is already tokenized. */
if(*endptr)
/* error handling */
else if(val < 0)
/* error handling */
else if(val > UINT8_MAX)
/* error handling */
else
/* The checks above make sure that the value fits into uint8_t. */
code[pc] = (uint8_t)val;
token = strtok(NULL, " ");
pc++;
for(int i = 0; i < pc; i++)
printf("code[%d] = 0x%02x\n", i, code[i]);
return 0;
错误处理取决于程序的其余部分。
注意事项:
strtok
修改输入字符串,因此它不能是const char[]
或字符串文字。
循环不包含对code[pc]
的超出范围访问的检查。
在上面的代码中编辑:检查*endptr
中的空格是不必要的,因为空格被用作标记分隔符,所以我们永远不应该在strtok
的结果中找到空格。
【讨论】:
在字符串已经被验证的情况下,错误检查可能是不必要的。这不在问题的有限范围内。我们被告知字符串包含什么,并且在给定前提条件的情况下,错误检查是多余的。这并不是说不建议这样做,只是说它超出了要求。 你我的朋友不知道我对这段代码有多感激,它就像魅力一样。如果你曾经在芝加哥或纽约。 ping我。我绝对值得为此喝一杯。以上是关于以编程方式填充 uint8_t 数组的主要内容,如果未能解决你的问题,请参考以下文章