以编程方式填充 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