以编程方式填充 uint8_t 数组
Programmatically populate a uint8_t array
我有一个 uint8_t 数组,应该如下所示。
uint8_t code[1000] = {0x66, 0xba, 0xf8, 0x03}
现在我不能在那个数组中硬编码值,我需要从 char buffer[300]
中一个一个地插入它们。 char buffer[300]
的内容是 space 分隔的十六进制字符串 "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
转换十六进制数字字符串的示例代码。
#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
中的 space,因为 space 用作标记分隔符,所以我们不应该在 strtok
.
的结果中找到 space
我有一个 uint8_t 数组,应该如下所示。
uint8_t code[1000] = {0x66, 0xba, 0xf8, 0x03}
现在我不能在那个数组中硬编码值,我需要从 char buffer[300]
中一个一个地插入它们。 char buffer[300]
的内容是 space 分隔的十六进制字符串 "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
转换十六进制数字字符串的示例代码。
#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
中的 space,因为 space 用作标记分隔符,所以我们不应该在 strtok
.