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

时间:2015-05-14 17:56:39

标签: c steganography

我正在研究Java中的隐写术程序。但我得到了建议,我可以在C程序中更好地解决这个问题。我想尝试一下,但我在C编程方面非常糟糕。现在我想读一个gif文件,找到用作图像分隔符的字节(GIF format中的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;
}

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

2 个答案:

答案 0 :(得分:3)

  

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

选项1:不依赖于终止空字符。

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");
    }
}

答案 1 :(得分:0)

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

$