【问题标题】:Read struct from binary file and convert to Hex in C从二进制文件中读取结构并在 C 中转换为十六进制
【发布时间】:2017-01-14 16:36:06
【问题描述】:

我正在尝试从二进制文件中读取一个简单的结构,并将其转换为十六进制。

我在尝试将内容打印到窗口中时遇到了问题。 “块”数据是一大块,所以我希望它会在第一个 printf 的窗口中打印很多二进制文件,然后为第二个 printf 打印十六进制。但是,它只打印一行 int 绝对不是它应该是的十六进制(它应该是一个很长的字符)

我想知道我做错了什么?我是否必须在每个字节上迭代一个 while 循环并将其转换为 byte_array 在六边形之前?还是我的类型错了?

这是我的代码:

void myChunks(){

    struct chunkStorage
    {
        char chunk;     // ‘Chunk of Data’
    };

    unsigned long e;

            FILE *p;
            struct chunkStorage d;
            p=fopen(“myfile.txt”,”rb");
            fread(&d.chunk,sizeof(d.chunk),1,p);
            printf(d.chunk);
            e = hex_binary(d.chunk);
            printf(e);
            fclose(p);

}

int hex_binary(char * res){
    char binary[16][5] = {"0000", "0001", "0010", "0011", "0100", "0101","0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110","1111"};
    char digits [] = "0123456789abcdef";

    const char input[] = ""; // input value
    res[0] = '\0';
    int p = 0;
    int value =0;
    while(input[p])
    {
        const char *v = strchr(digits, tolower(input[p]));
        if(v[0]>96){
            value=v[0]-87;
        }
        else{
            value=v[0]-48;
        }
        if (v){
            strcat(res, binary[value]);
        }
        p++;
    }
    return res;
    //printf("Res:%s\n", res);
}

【问题讨论】:

  • 您误解了“二进制”的含义。
  • int hex_binary(char * res){ ...return res;} ...???? o.O
  • 你介意给我们一些输入文件的例子和输入的预期输出吗?
  • 检查v 是否不是NULL 之后 阅读v[0] 没有多大意义。取消引用空指针会调用 未定义的行为
  • myChunks() 中的问题是您将chunkStorage 声明为具有单个 字符chunk 作为成员。 (如果你曾经费心打电话给myChunks(),你fread 1-byted.chunk。那么你怎么会期望来自1-byte 的长字符串呢?尽管事实上你从不显示 myChunks() 在您的代码中实际被调用。

标签: c struct binary fopen


【解决方案1】:

二进制到十六进制应该可以在这段代码中使用。它使用gcc 编译,但我没有测试它。我希望下面的代码可以帮助您以您想要的方式使用二进制进行十六进制。

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int binary2hex(char bin) {
    char *a = &bin;
    int num = 0;
    do {
        int b = *a == '1' ? 1 : 0;
        num = (num << 1) | b;
        a++;
    } while (*a);
    printf("%X\n", num);
    return num;
}

void main() {
    struct chunkStorage {
        char chunk;     // ‘Chunk of Data’
    };
    unsigned long e;
    FILE *p;
    struct chunkStorage d;
    p = fopen("myfile.txt", "rb");
    fread(&d.chunk, sizeof(d.chunk), 1, p);
    printf("%c", d.chunk);
    e = binary2hex(d.chunk);
    printf("%lu", e);
    fclose(p);
}

【讨论】:

    猜你喜欢
    • 2012-03-26
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多