gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:01:06 25 4
gpt4 key购买 nike

请耐心等待,我还是 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如果您需要更多信息,请下载该文件。那么我该如何修复上面的代码呢?

最佳答案

您所做的事情有一些问题。

  1. fseek只需调整文件指针以进行下一次读取或写入文件;它实际上不会为您从文件中检索任何内容。此外,fseek 的第三个参数的有效值是:

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

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

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

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

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

关于C 程序 - 如何验证文件中的特定字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41682334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com