首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从文件或输入中删除除十六进制之外的所有内容?

如何从文件或输入中删除除十六进制之外的所有内容?
EN

Stack Overflow用户
提问于 2018-06-18 14:32:58
回答 1查看 105关注 0票数 0

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

小样本文件

代码语言:javascript
复制
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()方法来匹配我正在寻找的特定十六进制值。如果我能够删除所有不是十六进制块格式的内容,或者只读取流中的十六进制,那么匹配十六进制的整个过程就会容易得多。

代码语言:javascript
复制
void ReturnAllLines(char *filePath)
{
    char currentLine[100];
    FILE *file = fopen(filePath, "r");

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

在其他语言中,我使用regex做过类似的事情,或者内置了方法,但我对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(),但是我尝试过的一切都失败了,我放弃了尝试,因为我不确定它是否能够做到这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-18 15:01:18

下面这些让你很接近我想。它使用strtok()将每一行拆分为以空格分隔的标记,然后使用scanf()检查令牌是否为十六进制字符。

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

代码语言:javascript
复制
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("");
}

它还检查每个令牌的宽度。如果要容纳不同字符宽度的十六进制值,则可以相当容易地调整该方面。

用你的样本输入输出..。

代码语言:javascript
复制
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  
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50911829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档