【问题标题】:Convert a Hex string into a uint8_t array in C将十六进制字符串转换为 C 中的 uint8_t 数组
【发布时间】:2020-11-15 04:31:57
【问题描述】:

我想读取一个文件,将其转换为十六进制字符串,然后将结果保存在一个 8 位(或一个字节)数组中。我正在逐字符读取文本文件并将其转换为十六进制并成功存储结果字符串,但现在我想将结果字符串数组放入二维数组矩阵中。
这个我试过了。

#include <stdio.h>
#include <string.h>
#include <stdint-gcc.h>


int main()
{
    int i=0,j;

    FILE *filePointer;
    char ch;
    int counter=0;
    char hex[50];
    filePointer = fopen("plaintext1.txt", "r");
    if (filePointer == NULL)
        printf("File is not available \n");
    else
    {
        while ((ch = fgetc(filePointer)) != EOF)
        {
         printf("%c", ch);
            hex[i] = ch;
            i++;
            counter++;
        }
    }
    /*set strH with nulls*/
    unsigned char strH[200];
    memset(strH,0,sizeof(strH));

    /*converting str character into Hex and adding into strH*/
    for(i=0,j=0;i<counter;i++,j+=2)
    {
       sprintf((char*)strH+j,"%02X",hex[i]);
    }
    strH[j]='\0'; /*adding NULL in the end*/
    printf("\nHexadecimal converted string is: \n");
    printf("%s\n",strH);
    //here i want to store the result in an array but failed here
    printf("\nThe matrix of the Hex is : \n");
    uint8_t text_hex[counter];
    int a ,b;
    for (a=0;a<strlen(strH) ;a++ ){
           text_hex[a] = strH[a];
           printf("%x",text_hex[a]); //this thing is annoying 
    }

    fclose(filePointer);
    return 0;
}

In the image there is result of program run, i read text from a file "plaintext1.txt" the content of file is "This is a string" ..program give me hex but not giving me correc array of those hex

【问题讨论】:

    标签: arrays c string hex


    【解决方案1】:

    一些事情:

    首先回答您的问题,text_hex[a] = strH[a] 正在转换 ascii 值。十六进制字符串将包含字符 [0 - 9]、[A - F] 和 [a -f] 对应于 ascii 值 [48 - 57]、[65 - 71] 和 [97 - 103](这些是 ascii十进制值)。要将十六进制字符串转换为相应的 uint8_t 值,您需要正确转换 ascii 值。在一个字节一个字节的基础上,这可以通过以下方式完成:

    text_hex[a] = strH[a] <= '9' ? strH[a] - 48 : (strH[a] <= 'F' ? strH[a] - 55 : strH[a] - 87);
    // strH[a] <= '9' is checking if the char is in the decimal range or letter range
    // strH[a] - 48 is the case where its decimal range which means the string -> int conversion is  ```char_value - 48```
    // (strH[a] <= 'F' ? strH[a] - 55 : strH[a] - 87); is for the letter range
    // strH[a] <= 'F' is checking if its a upper case letter
    // strH[a] - 55 converts an uppercase ascii hex char to its int value (55 == 'A' - 10)
    // strH[a] - 87 is the lower case equivilent
    

    有几点值得注意:上面的解决方案不是最有效的解决方案(这里主要是为了简单起见)。如果字符不是有效的 ascii 数字,它也会中断。

    现在还有一些其他的事情:

    for (a=0;a<strlen(strH) ;a++ ){
    

    并不正确,但几乎绝对不是您想要做的。您将重新计算每个循环strlen,然后循环遍历strH 以找到\0。这有效地将O(N)(N 是字符串的长度)转换为O(N^2) 函数。更好的是:

    int strH_length = strlen(strH);
    for (a=0;a< strH_length ;a++ ){
    

    hexstrH 的转换并没有真正意义(也许我遗漏了一些东西),但在我看来是 ascii 编码 -> ascii 编码。您可以直接从hex 进行转换。

    最后

    uint8_t text_hex[counter];
    

    不是很好的做法。 Counter 在编译时是未知的,因此尝试静态分配大小为 counter 的数组(取决于 counter 的值)可能会破坏事情。

    最好使用calloc 动态分配或使用常量静态分配。

    【讨论】:

    • 我发现答案很有帮助,但你能帮我进一步吗,因为在 text_hex[a] 我只得到一个 4 位十六进制。例如,对于“T”,十六进制是“54”(8 位),我存储时的结果是 text_hex[0] = 5 和 text_hex[1] = 4.. 我想完整存储 1 个字节在 text_hex[0] 例如 text_hex[0] = '54'.. 我是 C 编程新手,这就是为什么我的编码效率不高
    猜你喜欢
    • 2021-11-05
    • 2019-06-05
    • 2018-01-31
    • 2017-06-17
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 2019-10-14
    相关资源
    最近更新 更多