【问题标题】:Converting HEX data in a file to ascii将文件中的 HEX 数据转换为 ascii
【发布时间】:2014-11-28 10:48:52
【问题描述】:

我想解码 ASN.1 标准二进制文件。我已将二进制文件转换为十六进制并将其存储在一个文件中。现在我想将此十六进制转换为 ascii。我现在遇到的问题是如何读取 hex 文件。

文件看起来是这样的, 81 01 32 82 0D 35 31 34 32 34 31 38 38 38 其中 81 是标头,01 是大小,32 是数据。再次 82 是标题,并且继续。 我如何从这个文件中读取并区分存在的各个字段

我在整个互联网上搜索了这个,但无法得到满意的答案。所以有人可以帮助我前进的道路。我不想要任何代码,只想要我怎么做的过程。

【问题讨论】:

  • 使用fscanf(filepointer, "%d %d %d", &header, &size, &data)一次读取3个字节
  • @Santosh:%d 不读取十六进制。另外,最好只读取标题和大小,然后循环读取数据。
  • 是的,我还考虑将数据放入循环中。但不能这样做,因为标头大小并不总是 1 字节(上面的示例有 1 字节的标头,但并不总是相同),如果有多个字节地址,我不能增加 1。
  • 和@santosh,你想一次读3个字节吗?查看下一个字段的数据。它有 13 个字节长。
  • 为什么要将文件转换为十六进制,然后尝试读取十六进制?为什么不直接使用原始二进制文件?根据此类文件的大小,您可以将整个内容读入 unsigned char 数组或逐字节读取。

标签: c


【解决方案1】:

我会先读取标题,然后循环读取数据。您可以使用“x”-说明符读取十六进制数字(假设您的文件名为 hexfile.txt):

#include <stdio.h>

int main ()
{

    FILE *stream;
    unsigned int h, l, d;

    if( (stream  = fopen( "hexfile.txt", "r" )) == NULL ) return 1;

    while (EOF != fscanf (stream, " %x %x", &h, &l))
    {
        printf ("%02X %02X\n",h,l);

        for (unsigned i=0; i<l; ++i)
        {
            if (EOF == fscanf (stream, " %x", &d)) break;
            printf ("%02X ",d);
        }
        puts ("");
    }

    fclose (stream);

    return 0;
}

【讨论】:

  • 谢谢帮助。但是读取文件的时候怎么知道哪些数据代表header呢?
  • @Madhav:因为你描述了它:header-length-data-header-length-data-header-length-data...
猜你喜欢
  • 2019-09-13
  • 2012-11-04
  • 2015-10-30
  • 2014-09-05
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 2011-08-03
  • 2015-12-19
相关资源
最近更新 更多