从文件中读取标题部分

时间:2014-06-22 16:42:11

标签: c pointers byte bmp

你好伙伴stackoverflowers。

我在C代码中做了一个小爱好项目,我想对.BMP文件进行处理。 所以对我来说,我使用这个维基百科页面Bmp file format

但很快我就难倒了一个问题。 我试图读取文件的前14个字节,即位图文件头。 但是当我打印读取的字节时,它们的长度只有8个字节?这是因为其他字节是零还是我做错了什么?

来自GDB:

(gdb) p pImageHeader 
$3 = 0x602250 "BMz\270\v"
(gdb) x pImageHeader 
0x600x602250:   0xb87a4d42

这是我的代码:

#include <stdio.h>
#include <stdlib.h>


int main(int argc, char* argv[])
{
// If arguments are less than 2, just quit and tell user how do use the god damn program!
if (argc < 2)
{
    printf("Usage : %s xxxx.bmp \n", argv[0]);
    exit(1);
}

// Create file pointer and attach it to argument file location
FILE* pImageFile;

pImageFile = fopen(argv[1], "r");

// if file doesn't open, quit the program   
if (pImageFile == NULL)
{
    printf("Some error occured openening file : %s \n", argv[1]);
    exit(1);
}

char* pImageHeader;
pImageHeader = malloc(sizeof(char) * 14);
if (pImageHeader == NULL)
{
    printf("Error asking for RAM \n");
    exit(1);
}

const int HEADER_SIZE = 14; 
size_t bytes_read = fread(pImageHeader, 1, HEADER_SIZE, pImageFile);

if (bytes_read < HEADER_SIZE)
{
    printf("Something went wrong reading file header! \n");
    exit(1);
}

int i = 0;
    for (i; i != 14; i++)
{
    printf("%02X ", pImageHeader[i]);
}

    printf(" \n");
return 0;
}

编辑: 更改源代码以检查实际读取的字节数。它通过它读取14个字节。

1 个答案:

答案 0 :(得分:3)

你的代码很好。您的调试命令不是。

(gdb) p pImageHeader 
$3 = 0x602250 "BMz\270\v"

由于pImageHeaderchar*,因此GDB假定它是以NUL终止的“C字符串”,当您说p时,它会尝试打印它。如果前14个字节中有NUL个字节,GDB将停止在那里打印字符。

相反,请尝试x/14xb pImageHeader。这将从指针pImageHeader打印 14 x b ytes。

当然,您还应该参考GDB的文档,特别是8.5 Examining memory

我的SSCCE

#include <stdlib.h>
#include <string.h>
int main()
{
    char *p = malloc(20);
    memcpy(p, "Test\0Worked\0", 12);
    return 0;
}

GDB:

(gdb) print p
$1 = 0x601010 "Test"                        <--- See, this failed!
(gdb) x/12xb p
0x601010:   0x54    0x65    0x73    0x74    0x00    0x57    0x6f    0x72
0x601018:   0x6b    0x65    0x64    0x00
(gdb) x/12cb p
0x601010:   84 'T'  101 'e' 115 's' 116 't' 0 '\000'    87 'W'  111 'o' 114 'r'
0x601018:   107 'k' 101 'e' 100 'd' 0 '\000'
(gdb) 

另见: