【问题标题】:Reading image file contents to buffer读取图像文件内容到缓冲区
【发布时间】:2017-03-25 01:02:22
【问题描述】:
char* full_string;
int size;
FILE* f = fopen(filename,"r");

fseek(f,0,SEEK_END);
size = ftell(f);
fseek(f,0,SEEK_SET);
full_string = malloc(size+1);
fread(full_string,1,size,f);
fclose(f);

full_string[size] = '\0';

我正在尝试使用上述代码将文件的内容读取到名为“full_string”的缓冲区中,但是当我在 gdb 中逐步执行时,我发现以下内容存储在“full_string”中:

full_string = 0xa46df0 "\377\330\377", <incomplete sequence \340>

我完全是 C 新手,所以我不知道如何解释这个问题。值得一提的是,我正在阅读的文件是图像文件。这些图像中的大多数大小为 50,000 字节或更大。任何帮助将不胜感激!

【问题讨论】:

  • 您希望在full_string 中出现什么?调试器试图将其解释为字符串,但图像不是字符串。因此,您的 code 可能没问题,但您的 debugger 可能会感到困惑。
  • @ScottHunter 或者只是无法显示这么大的字符串
  • “字符串”是一堆以 0 结尾的字节,存储在 char * 中(或 char[] 在传递给事物时衰减为 char *)。如果您输入的不是那种非常特定的格式,那么您不是在制作字符串,而是在制作字节序列。不过,GDB 并不知道您没有创建字符串。怎么可能?因此它假定它是一个字符串,并且在将其解释为字符串时会出错,因为它不是一个字符串。
  • @QPaysTaxes 我明白了,我认为这可以解决问题。由于上述问题以及 strlen() 返回 4 的事实,我假设 char 数组实际上并未保存数据,但如果它被误解为长度为 4 的字符串,这是有道理的。感谢所有帮助!
  • 我已经把我的评论变成了答案。你能通读一遍并确保它仍然解释了它应该解释的一切吗?

标签: c io buffer


【解决方案1】:

char * 不会自动表示字符串。在 C 中,字符串是一个字节序列,存储在 char * (或 char [] 中,当它传递到某个地方时会衰减为 char *,但让我们认为这些对于这个答案来说是相同的东西)。这一系列字节必须以空字节'\0' 结尾,并且不能在内部的任何位置包含它。

如果您在十六进制编辑器中打开该特定文件,您可能会看到类似FF D8 FF E0 00 的内容,假设我 (a) 正确进行了八进制-十六进制转换并且 (b) 没有犯任何其他愚蠢的错误。这在文件中是有效的,但是如果你试图将它解释为一个字符串——例如strlen,或者 GDB 所做的——你将不会得到 ~50000 个字符的预期值,因为少于 ~第一个空字节之前的 50000 个字符。这也意味着用'\0' 终止你的“字符串”有点毫无意义;我的意思是,它 不是 一个字符串。这是一个字节序列。

如果长度很重要,您需要将其存储在一个结构或另一个变量中,具体取决于您的要求。

【讨论】:

    猜你喜欢
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 2013-01-21
    • 2013-03-02
    • 2014-07-13
    • 2021-09-26
    • 2016-12-27
    相关资源
    最近更新 更多