Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读取C中的十六进制文件_C_File_Hex_Fgets_Scanf - Fatal编程技术网

读取C中的十六进制文件

读取C中的十六进制文件,c,file,hex,fgets,scanf,C,File,Hex,Fgets,Scanf,我试图从文本文件中读取十六进制值 可以有20000条不同长度的线 0F61048C 1F1ED7F855A106CB20D574C24833 52D3C74F410FC1143C6DE298933 CF8630C79991046C587474E4B858 6EF8745D6000ACDB3757ECEB79EB 我不能使用fgets,因为它在内存中存储时将每个值转换为ASCII。我正在考虑使用fscanf,因为有格式说明符%x。但是如何使用fscanf阅读整行内容呢?我知道这不是最好的阅读方式。

我试图从文本文件中读取十六进制值

可以有20000条不同长度的线

0F61048C

1F1ED7F855A106CB20D574C24833

52D3C74F410FC1143C6DE298933

CF8630C79991046C587474E4B858

6EF8745D6000ACDB3757ECEB79EB

我不能使用fgets,因为它在内存中存储时将每个值转换为ASCII。我正在考虑使用fscanf,因为有格式说明符%x。但是如何使用fscanf阅读整行内容呢?我知道这不是最好的阅读方式。也许是fgets,但是fgets转换为ASCII,我不想使用这个。 在fgets中,如果有像01 04 05 FF这样的六角线,它将作为3031 3034 3035 4646存储在内存中。将此格式转换回01 04 05 FF确实很麻烦


有人能帮我吗?我被这个问题困扰了将近两周。

您当然可以使用
fgets()
来实现这一点,对于可变长度的行,这可能比使用
fscanf()
容易得多。例如:

char buf[200];
while (fgets(buf, sizeof(buf), infile) != NULL) {
    unsigned char a[200];
    int i = 0;
    while (buf[i] != '\n') {
        int b; // must use int with sscanf()
        sscanf(&buf[i], "%2x", &b);
        a[i] = b;
        i += 2;
    }
}

上面没有错误检查(非十六进制数字、行中奇数数字等)。但这是一般的想法。

一旦它将文件中的一行读取到buf,它就会转换为ASCII。例如:0F61048C以(3046 3631 3034 3843)的形式存储在mem中。我试过上面的代码。我仍然无法恢复我的十六进制值。我不能使用fscanf吗?我知道ASCII字符是如何存储在内存中的。调用
sscanf()
将它们从十六进制表示形式解码回字节。如果您愿意,您可以使用
fscanf()
,但我发现该函数使用起来很烦人。例如,如果在第一次迭代中数据为01010001,(在内存3031 3030 3031中),则b的值为61。并将其保存在[0]中,作为十六进制值为61的3D。上面的代码对我来说很好。它应该会起作用。但是我不知道为什么它对我不起作用。对不起,我的参数是
sscanf()
向后的。我已经修好了。非常感谢格雷格。在我的模块中,我几乎遇到了复杂的问题。不幸的是,我不能投票赞成你的答案。我没有足够的声誉:P.您的数据是否以ASCII格式存储?如果是这样,那么使用fgets并不是真正的“转换”它,只是读取它。在使用
sscanf
解析文本之前,使用
fgets
在一个小的文本缓冲区中读取文本几乎不会对性能造成损害。