Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将位图头中的字节值写入文件_C++_Bitmap_Hex - Fatal编程技术网

C++ 将位图头中的字节值写入文件

C++ 将位图头中的字节值写入文件,c++,bitmap,hex,C++,Bitmap,Hex,我正在尝试将位图头写入文件。目前,我只想写没有任何像素数据的标题。我的价值观是基于,和。我有以下功能,用于将标准、未压缩的24位RGB位图头组成uint8\t: uint8_t* make_rgb24_bmp_header(int data_size, int width, int height) { uint8_t* ret = new uint8_t[BITMAP_HEADER_SIZE]; //signature ret[0] =

我正在尝试将位图头写入文件。目前,我只想写没有任何像素数据的标题。我的价值观是基于,和。我有以下功能,用于将标准、未压缩的24位RGB位图头组成uint8\t:

uint8_t* make_rgb24_bmp_header(int data_size, int width, int height)
    {
        uint8_t* ret = new uint8_t[BITMAP_HEADER_SIZE];

        //signature
        ret[0] = 'B';
        ret[1] = 'M';

        //2-3-4-5
        write_32bit_num_to_data(ret + 2, data_size); //file size in bytes as hexadecimal

        ret[6] = 0;
        ret[7] = 0;
        ret[8] = 0;
        ret[9] = 0;
        //specifies the starting offset of the image - 54 bytes in.
        ret[10] = 0x36;
        ret[11] = 0;
        ret[12] = 0;
        ret[13] = 0;
        //specifies header size - 40 bytes
        ret[14] = 28;
        ret[15] = 0;
        ret[16] = 0;
        ret[17] = 0;

        //18,19,20,21 - image width
        write_32bit_num_to_data(ret + 18, width);
        //20,23,24,25 - image height
        write_32bit_num_to_data(ret + 22, height);

        //planes - 1
        ret[26] = 1;
        ret[27] = 0;
        //bpp - 24
        ret[28] = 18;
        ret[29] = 0;
        //compression - 0
        ret[30] = 0;
        ret[31] = 0;
        ret[32] = 0;
        ret[33] = 0;

        //34,35,36,37
        write_32bit_num_to_data(ret + 34, data_size); //compressed size - no compression here, so same as data_size
        //38,39,40,41
        write_32bit_num_to_data(ret + 38, 2835); //Horizontal resolution in pixels per meter
        //42,43,44,45
        write_32bit_num_to_data(ret + 42, 2835); //Vertical resolution in pixels per meter

        //number of colors - not needed as we're not using a color palette
        ret[46] = 0;
        ret[47] = 0;
        ret[48] = 0;
        ret[49] = 0;

        //important colors - not needed
        ret[50] = 0;
        ret[51] = 0;
        ret[52] = 0;
        ret[53] = 0;

        return ret;
    }
我用以下方式保存它:

int main(int argc, char** argv)
{

    uint8_t* header = utils::make_rgb24_bmp_header(1244214, 720, 576);

    ofstream out;

    out.open("sample_header", ios::out | ios::binary);

    out.write((char*)&header, 54);

    out.close();

    return 0;
}

我希望文件的前两个字节是444D,但当我在Bless中打开输出文件时,它们显示为F0E0。很明显,我遗漏了一些重要的东西,我还可以看到其余的值是不正确的,理解前两个字节哪里出了问题应该可以帮助我解决其余的问题。如何获得预期的输出?

您将错误的值传递给out。写入:

out.write((char*)header, 54);

通过将其作为&header传递,您试图写出指针存储位置的值,而不是指针指向的位置和数据所在的位置。

Change out.writechar*&header,54;到out.writechar*头,54;。ret[14]=28。。。28还是0x28?还包括ret[28]=18;?无论是使用全十六进制还是全十进制,尝试混用都会让你忘记十六进制0x前缀之类的东西。这是一件容易错过的事情!你说得对。我在写指针周围的记忆。