【问题标题】:How can I strip all but hex from file or input?如何从文件或输入中删除除十六进制之外的所有内容?
【发布时间】:2018-06-18 14:32:58
【问题描述】:

我正在尝试读取包含随机句子、数据和十六进制块的文件。我只想阅读十六进制块。下面是该文件的一个简短示例。


小样本文件

Serial Number   :   1234
More Data       :   7-9-2

-------------------------

Mak:  A5 12 00 24 00 01 22 00 4F 11
      A2 48 4A D1 53 6D 8A D1 61 40

t+00:00:00:00   : Mix one

Mak:  A5 22 30 44 50 01 22 00 4F 11
      A2 18 2A 31 43 6D 8A D1 61 40 

A random sentence.

下面是我用来读取文件中所有行的内容,并经常添加strstr() 方法来匹配我正在寻找的特定十六进制值。如果我可以去掉所有不是十六进制块格式的东西,或者只将十六进制读入流中,那么匹配十六进制的整个过程会容易得多。

void ReturnAllLines(char *filePath)
{
    char currentLine[100];
    FILE *file = fopen(filePath, "r");

    while(fgets(currentLine, sizeof(currentLine), file) != NULL)
    {
        printf(currentLine);
    }
}

在其他语言中,我使用正则表达式或内置方法做过类似的事情,但我是 c 新手,我不确定最好的方法是什么。

理想情况下,最终输出类似于以下内容:

A5 12 00 24 00 01 22 00 4F 11 A2 48 4A D1 53 6D 8A D1 61 40

A5 22 30 44 50 01 22 00 4F 11 A2 18 2A 31 43 6D 8A D1 61 40

每个块都有一些东西可以区分两者。但即使是一条巨大的十六进制线也会更好。我曾考虑使用sscanf(),但我尝试过的一切都失败了,我放弃了尝试,因为我不确定它是否能够做到这一点。

【问题讨论】:

  • 你真的想加入S5 - 还是打错字?
  • S5 对该输入意味着什么
  • 编辑了S5,因此它不会触发未来的十六进制阅读器。我正在努力赶上 :)
  • 好的,可能还想修正“...最终输出...”部分中的错字。
  • 顺便说一下函数建议是C函数。

标签: c hex scanf fgets


【解决方案1】:

我认为以下内容可以让您非常接近。它使用strtok() 将每一行拆分为以空格分隔的标记 - 然后使用scanf() 检查标记是否为十六进制字符。

您可以将其插入到您的 ReturnAllLines() 函数中(通过将 printf(currentLine) 替换为 PrintLineHex(currentLine))。

void PrintLineHex(char *line) {
    char *nl = NULL, *tok = NULL;
    int convs = 0;
    unsigned ch = '\0';
    int hex_line = 0;

    nl = strchr(line, '\n');
    if (nl) *nl = '\0';  // Remove new-line char ...
    tok = strtok(line, " ");
    hex_line = 0;
    while (tok) {
        convs = sscanf(tok, "%x", &ch);
        if (convs == 1 && strlen(tok) == 2) {
            hex_line = 1;
            printf("%02hhX ", ch);
        }
        tok = strtok(NULL, " ");
    }
    if (hex_line) puts("");
}

它还检查每个标记的宽度。如果您想适应不同字符宽度的十六进制值,您可以相当轻松地调整该方面。

使用您的示例输入输出...

A5 12 00 24 00 01 22 00 4F 11   
A2 48 4A D1 53 6D 8A D1 61 40   
A5 22 30 44 50 01 22 00 4F 11   
A2 18 2A 31 43 6D 8A D1 61 40  

【讨论】:

  • 谢谢,里面有很多我不知道的东西。它完全符合我的需要。
  • @trueCamelType:很高兴它有所帮助,并感谢您的反馈。
猜你喜欢
  • 2012-12-10
  • 2021-04-20
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多