将字符串转换为uint8_t的数组

时间:2014-02-11 19:01:39

标签: java c arduino

对于我的项目,我需要从SD卡读取一些单行文本,然后获取字符串中每个字符的十六进制或十进制值,并将这些值分组到数组中。

文本中没有空格,行以\ n

结尾

我正在使用此代码将所有内容读入单个字符串!

            String line = "";

            while (dataFile.available() != 0) 
            {   
              line = dataFile.readStringUntil('\n');    
              if (line == "") 
                break;  
            } 

为了以后的使用,我需要计算每个字符的十六进制值,这段代码应该迭代字符串并将其分组在一个数组中。

            int lineSize = line.length();

            uint8_t data[lineSize];

            for (int i = 0; i < lineSize; i++)
            {
              data[i] = line.charAt(i);                 
            } 

我真的不知道这是否有效,但我怀疑我会得到实际的十六进制值......

价值观在某处,但我真的不知道如何访问它们!

结果应如下所示:

uint8_t data[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}

3 个答案:

答案 0 :(得分:1)

将十六进制 视为另一种格式,以显示存储在内存中的任何数据类型(uint8_t,或char或int ...)。在内存中,它的所有二进制或十六进制。只是取决于你想看它的方式。

例如:以下陈述:

long int    A = 34;
uint8_t     B = 34;
char        C = 34;
int         D = 34;

printf("0x%02x\n", 'A'); // surrounded with '' gives ASCII value of 65, then displayed in Hex
printf("0x%02x\n", A);
printf("0x%02x\n", B);
printf("0x%02x\n", C);
printf("0x%02x\n", D);

结果:
enter image description here

将任何字符串分解为其基本元素(char或uint8_t)并如上所示打印它们将产生类似的结果。

<强> 修改
对于此输入文件(在可执行文件目录中将其命名为in.txt):

lkjahldfkjghlskjhlskjhlakdjgglsjkahlkj4hl5k6jh67=83kjhlkjshdf8f7s698s7dfgbslfkjbg   

并使用此代码:

int main(void)
{
    FILE *fp;
    char filename[]=".\\in.txt";
    uint8_t c;
    int length=0, i=0;
    uint8_t *array;

    //Get number of entries in file:
    fp=fopen(filename, "r");
    c= fgetc(fp);
    while(c<255)
    {
        length++;   
        c= fgetc(fp);
    }
    fclose(fp);

    //give array sufficient space
    array = malloc(sizeof(uint8_t)*length);

    fp=fopen(filename, "r");

    //read file into array, and display as hexadecimal
    c = fgetc(fp);
    while(c<255)
    {
        array[i++]= c;
        printf("0x%02x\n", c);
        c = fgetc(fp);  
    }
    fclose(fp);
        getchar();//stop execution to view files (hit any key to exit)
        return 0
}  

您应该看到 此输出:(仅显示前20个左右的值...)
enter image description here

答案 1 :(得分:0)

C / C ++中的字符串已经是数组(即使被更高级别的类std::string抽象)。数组元素是每个字符的字符值。你确定你不能只抓住字符串。c_str()(或。data())并使用它,可能还有一个演员?

答案 2 :(得分:0)

好吧,如果通过获取十六进制代码意味着获取这些字符的十六进制表示,您可以这样做 -

const String hexDigits = "0123456789abcdef";
char hex[2] = "";

hex[0] = hexDigits[ (int)line.at(i) / 16 ];
hex[1] = hexDigits[ (int)line.at(i) % 16 ];

例如,如果line.at(i) = A,则hex将为"41"