在C中将十六进制字符数组转换为u8数组

问题描述 投票:0回答:1

现在我有一个u8数组,我成功转换为十六进制char数组。现在,尝试将其更改为u8阵列一直是一种困难。我试过这段代码:

        // DEMO:
        char *message = "0f236a1f";
        int i;
        u8 final[4];
        memset(final, 0, 4);
        char* part = "00";
        for (i = 0; i < 4; i++)
        {
            memcpy(part, &message[i*2], 2);
            u8 num = 0;
            sscanf(part, "%x", &num);
            printf("%i", num); 
            final[i] = num;
        }

我使用值预先填充所有内容,以防止保留内存值,从而弄乱我实际数据中的大部分零。尽管我尝试了所有的东西,偶尔会分配错误的值,我找不到任何其他在线做同样事情的方法。如果可以,请帮助我,我讨厌C.

编辑:

我修改了我的代码,现在正在显示真实的东西,看它是否有帮助。可变消息是巨型char *数组中的464个零。控制台仍然偶尔打印除零之外的数字,不知道为什么:

        int i;
        u8 final[232];
        memset(final, 0, 232);
        char part[3] = "00";
        part[2] = 0;
        for (i = 0; i < 232; i++)
        {
            memcpy(part, &message[i*2], 2);
            unsigned int num = 0;
            sscanf(part, "%x", &num);
            printf("%i", num); 
            final[i] = (u8)num;
        }
c arrays
1个回答
3
投票

您正在使用以下行创建未定义的行为:

    char* part = "00";
    for (i = 0; i < 4; i++)
    {
        memcpy(part, &message[i*2], 2);
        ...
        sscanf(part, "%x", &num);

part指向只读内存(这就是为什么对于像这样的字符串我们通常将它们声明为const char*,以便在修改尝试发生时导致编译器错误)More info here.

你应该为你的字符串和null终止符分配足够的空间:

char part[3] = "00";
© www.soinside.com 2019 - 2024. All rights reserved.