我试图读取一个混合了随机句子,数据和十六进制块的文件。我只想读取十六进制块。该文件的一个简短示例如下。
小样本文件
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的新手,而且我不确定最佳方法是什么。< / p>
理想情况下,最终输出类似于以下内容:
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()
,但我尝试过的所有内容都失败了,我放弃了尝试,因为我不确定它是否能够做到这一点。
答案 0 :(得分:2)
以下内容让我非常接近。它使用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