我正在尝试读取一个包含随机句子、数据和十六进制块的文件。我只想在六角区阅读。下面是该文件的一个简短示例。
小样本文件
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);
}
}在其他语言中,我使用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(),但是我尝试过的一切都失败了,我放弃了尝试,因为我不确定它是否能够做到这一点。
发布于 2018-06-18 15:01:18
下面这些让你很接近我想。它使用strtok()将每一行拆分为以空格分隔的标记,然后使用scanf()检查令牌是否为十六进制字符。
您可以将它插入到您的ReturnAllLines()函数中(通过用PrintLineHex(currentLine)替换printf(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 https://stackoverflow.com/questions/50911829
复制相似问题