从缓冲区读取字节(字符)

3
我正在使用Java编写隐写程序,但是我得到了建议,说我可以用C程序更好地解决这个任务。我想尝试一下,但是我的C编程非常糟糕。现在我想读取一个gif文件,并找到用作图像分隔符的字节(从GIF格式中为0x2c)。
我尝试编写这个程序:
int main(int argc, char *argv[])
{
    FILE *fileptr;
    char *buffer;
    long filelen = 0;

    fileptr = fopen("D:/test.gif", "rb");  // Open the file in binary mode
    fseek(fileptr, 0, SEEK_END);          // Jump to the end of the file
    filelen = ftell(fileptr);             // Get the current byte offset in the file
    rewind(fileptr);                      // Jump back to the beginning of the file

    buffer = (char *)malloc((filelen+1)*sizeof(char)); // Enough memory for file + \0
    fread(buffer, filelen, 1, fileptr); // Read in the entire file
    fclose(fileptr); // Close the file

    int i = 0;
    for(i = 0; buffer[ i ]; i++)
    {
        if(buffer[i] == 0x2c)
        {
            printf("Next image");
        }
    }


    return 0;
}

有人能给我建议如何修复我的循环吗?


你看到了什么问题?0x2C0x00也可以是图像中的数据字节。 - Mohit Jain
你的循环是如何中断的?目前情况下,只要 buffer[i] 为零,它就会退出;这是你想要的吗? - Politank-Z
你能使用 for(i = 0; i<filelen; i++) 吗? - ryyker
@Politank-Z 我发的链接里写着 0x2c 是用作图像分隔符的字节。我怎么才能识别它是图像分隔符还是普通字节呢? - Sk1X1
我不明白 - 你已经在循环中测试 buffer[i] == 0x2c。从你的话来看,这似乎是你区分图像分隔符和普通字节的方式。 - Politank-Z
我的问题是,控制台没有打印任何内容。因此,我的条件(或整个循环)可能有误或者链接中的信息有误。这就是为什么我在这里发布帖子,想要找出代码是否正确的原因。 - Sk1X1
2个回答

4

有人能给我建议怎样修复我的循环吗?

选项一:不要依赖于终止的空字符。

for(i = 0; i < filelen; i++)
{
    if(buffer[i] == 0x2c)
    {
        printf("Next image");
    }
}

选项2:在依赖于它之前添加终止空字符。这可能不可靠,因为您正在读取可能包含嵌入式空字符的二进制文件。

buffer[filelen] = '\0';
for(i = 0; buffer[ i ]; i++)
{
    if(buffer[i] == 0x2c)
    {
        printf("Next image");
    }
}

应该是 buffer[filelen-1]=\0; 吗? - ryyker
@ryyker,filelen是正确的,因为他已经分配了filelen+1个字符。 - R Sahu

0

类似于基于'for()'的答案,如果您只需要检查特定字节(0x2c),则可以使用while()执行以下操作(不必担心字节流中的null)。

i = 0;
while(i < filelen)
{
    if(buffer[i++] == 0x2c)
    {
        printf("Next image");
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接