以编程方式填充 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 数组的主要内容,如果未能解决你的问题,请参考以下文章

C ++将mac id字符串转换为uint8_t数组

在 uint8_t 数组中插入()

uint8_t 数组的数组

如何将字符数组转换为 uint8_t

切片一个 uint8_t 数组

将 unsigned char 数组转换为 uint8_t 数组?