请耐心等待我,我还是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,如果您需要更多信息,请下载该文件。那么如何修复上面的代码?
答案 0 :(得分:1)
你正在做的事情有些不妥。
fseek
只需调整 next 读取或写入文件的文件指针;它实际上并没有为你从文件中检索任何东西。此外,fseek
的第三个参数的有效值为:
SEEK_SET
- 将文件指针的位置设置为文件的开头加上第二个参数中的值
SEEK_CUR
- 将文件指针的位置设置为文件指针的当前位置,再加上第二个参数中的值
SEEK_END
- 将文件指针的位置设置为文件末尾。
假设您打算从位置0x1fc30&#34;的文件中读取16个字节,您可能希望将该数据保存为字节数组,而不是字符串:
typedef unsigned char byte;
byte s_no[16];
fseek(fp, 0x1fc30, SEEK_SET);
fread(s_no, 1, 16, fp);
虽然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");
}