C程序 - 如何验证文件中的特定字符串

时间:2017-01-16 17:56:26

标签: c

请耐心等待我,我还是C编程的新手,我的目标是获取一个保存在名为mtd0的文件中的序列号并验证该序列号。在bash中,命令是:

dd if=/dev/mtd0 bs=1 skip=$((0x1fc30)) count=16 2>/dev/null

输出应为:

1866203214226041

但我想用纯C语言做,我到目前为止尝试的是这样的:

#include <stdio.h>
#include <string.h>

int main ()
{
    FILE *fp;
    FILE *s;

    fp = fopen("/tmp/mtd0","rb");
    if(NULL == fp) {
        printf("\n Cannot open file!!!\n");
        return 1;
    }
    typedef unsigned char byte; 
    byte s_no[16];
    fseek(fp, 0x1fc30, SEEK_SET);
    fread(s_no, 1, 16, fp);
    printf ("Serial number: %s\n", s_no);
    fclose(fp);

    char mtd0[16];
    char defser[16];
    int ret;

    memcpy(mtd0, s_no, 16);
    memcpy(defser, "1866203214226041", 16);

    ret = memcmp(mtd0, defser, 16);

    if(ret == 0)
    {
        printf("Serial number is correct!\n");
    }
    else 
    {
        printf("Serial number is not correct\n");
    }

    return(0);
}

但是当我执行它时,它不会打印任何东西。 mtd0不是普通的文本文件,我不知道它被调用了什么,但文件看起来像this,如果您需要更多信息,请下载该文件。那么如何修复上面的代码?

3 个答案:

答案 0 :(得分:1)

你正在做的事情有些不妥。

  1. fseek只需调整 next 读取或写入文件的文件指针;它实际上并没有为你从文件中检索任何东西。此外,fseek的第三个参数的有效值为:

    • SEEK_SET - 将文件指针的位置设置为文件的开头加上第二个参数中的值

    • SEEK_CUR - 将文件指针的位置设置为文件指针的当前位置,再加上第二个参数中的值

    • SEEK_END - 将文件指针的位置设置为文件末尾。

  2. 假设您打算从位置0x1fc30&#34;的文件中读取16个字节,您可能希望将该数据保存为字节数组,而不是字符串:

    typedef unsigned char byte; 
    byte s_no[16];
    fseek(fp, 0x1fc30, SEEK_SET);
    fread(s_no, 1, 16, fp);
    
  3. 虽然strcmp是比较C中字符串的正确方法,但如果序列号存储为 bytes ,我假设它是,因为{ {1}}看起来像一个二进制文件,您必须使用/dev/mtd0将内存与另一个设置为串行有效值的字节数组进行比较。

答案 1 :(得分:0)

fseek不会从文件中读取,它只是移动文件指针以供下次读取。您需要使用fread从文件中读取。关于fread的文档可以在这里找到:https://linux.die.net/man/3/fread

此外,最好以二进制模式打开二进制文件:

fopen("mtd0","rb");

根据Alden的评论,C中的字符串比较是使用一个名为strcmp的函数完成的,其文档可以在这里找到:https://linux.die.net/man/3/strcmp

最后,您应该完全符合mtd0的路径,即:

fopen("/dev/mtd0","rb");

答案 2 :(得分:0)

使用strcmp

if (strcmp (sn, "1866203214226041") != 0) {
    printf("Serial number is correct\n");
}