你好伙伴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个字节。
答案 0 :(得分:3)
你的代码很好。您的调试命令不是。
(gdb) p pImageHeader
$3 = 0x602250 "BMz\270\v"
由于pImageHeader
是char*
,因此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)
另见: