【问题标题】:Magic number in files. C programming文件中的幻数。 C 编程
【发布时间】:2014-06-11 13:31:04
【问题描述】:

我想从二进制文件中获取幻数。例如,JPG 文件的第一个字节中的幻数为 FFD8。我怎样才能读到这个? 我想编写一个程序来检查文件扩展名是否响应幻数以及是否不重命名文件。

这是我认为应该的,但它不起作用。它总是打印不同的值。如果文件是 JPG,我希望它给我一个幻数 - FFD8。

int main()
{
    FILE *f;
    char fName[80];
    char *array;
    long fSize;

    printf("Input file name\n");
    scanf("%s", fName);
    if((f=fopen(fName, "rb"))==NULL)
    {
        fprintf(stderr, "Error\n");
        exit(1);
    }

    fseek (f , 0 , SEEK_END);
    fSize = ftell (f);
    rewind (f);
    array=(char *)malloc(fSize+1);

    fread(array, sizeof(char), 4, f);
    printf("%x", array);
    free(array);
}

【问题讨论】:

  • 有什么理由让你觉得有必要找出整个文件的大小,并制作一个足够大的缓冲区来容纳它,而实际上你只关心和复制四个字节?如果是这样,您是否意识到文件系统会通过简单的fstat() 高兴地告诉您文件大小?
  • 我第一次使用二进制文件,所以我想尝试一些新的东西。但是,你能告诉我更多关于 fstat() 的信息吗,因为我找不到任何关于它的信息。
  • 好吧,fstat() 不在 C 标准中,但在 POSIX 中,尽管我几乎可以肯定在其他操作系统系列中也有等价物。要使用fstat(),请创建struct stat x,然后在文件描述符/名称和x 上调用f-/l-/stat()。那你看看x.st_size

标签: c magic-numbers


【解决方案1】:

printf("%x", ...) 需要一个int 参数,而你给它一个char *,即一个指针。那是未定义的行为。

你的意思可能是

printf("%02hhx%02hhx%02hhx%02hhx\n", array[0], array[1], array[2], array[3]);

将前 4 个字符打印为十六进制数字。 (感谢@chux 提醒 关于“hh”修饰符的我,它指定转换适用于有符号或无符号char 参数。)

(但请注意,“FFD8”是两个字节的十六进制表示法:0xFF,0xD8。)

【讨论】:

  • 你能告诉我 02 代表什么吗?我得到了 ffffffffffffffd8ffffffffffffffe0 。有什么想法吗?
  • @user3476022:将您的数组声明为 unsigned char *array; ,然后您将获得正确的输出。 “02”表示每个数字都印有两位数,例如00、01、FF。
  • 谢谢你,伙计。如果您解释为什么它只适用于未签名的,我将不胜感激?我是初学者,我第一次使用十六进制。
  • 可以使用"%02hhx",不用担心符号扩展。
  • @chux:你完全正确,我忘记了这一点。答案已更新。
猜你喜欢
  • 2022-01-05
  • 1970-01-01
  • 2014-02-08
  • 2023-04-07
  • 2019-05-04
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多