Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.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++ 理解此代码(将十六进制直接写入文件-midi)_C++_File Format - Fatal编程技术网

C++ 理解此代码(将十六进制直接写入文件-midi)

C++ 理解此代码(将十六进制直接写入文件-midi),c++,file-format,C++,File Format,我找到了这个密码 ofstream myfile; myfile.open ("output.midi",ios::binary); char buffer[44] = {0x4D,0x54,0x68,0x64,0x00,0x00,0x00,0x06,0x00,0x01,0x00,0x01,0x00,0x80,0x4D,0x54,0x72,0x6B,0x00,0x00,0x00,0x16,0x80,0x00,0x90,0x3C,0x60,0x81,0x00,0x3E,0x60,0x81,0x00

我找到了这个密码

ofstream myfile;
myfile.open ("output.midi",ios::binary);
char buffer[44] = {0x4D,0x54,0x68,0x64,0x00,0x00,0x00,0x06,0x00,0x01,0x00,0x01,0x00,0x80,0x4D,0x54,0x72,0x6B,0x00,0x00,0x00,0x16,0x80,0x00,0x90,0x3C,0x60,0x81,0x00,0x3E,0x60,0x81,0x00,0x40,0x60,0x81,0x00,0xB0,0x7B,0x00,0x00,0xFF,0x2F,0x00};
myfile.write(buffer,44);

我如何理解这一点,我可以看到前2个字节=MZ是一个PE头签名,但是其他十六进制值呢,如何将十六进制写入一个文件,虽然我猜这些十六进制值来自十六进制转储,或者是否有办法手动预测要写入的十六进制值(除了头)

我试图理解文件格式,bmp,jpeg,exe,wav等,在这个例子中是midi

您可以从纯代码创建bmp。例如,您需要知道头文件格式,然后只需创建像素值的缓冲区数组并使用fopen()fwrite()


了解EXE等其他文件格式如何?我认为EXE是独一无二的,因为它是由函数/变量编译而成的,而不仅仅是一个像素或声音值文件。

对于任何文件,都有一个能够从应用程序读取的结构,基本上,如果你知道文件的结构,你可以直接将所有内容写入文件,我为office documnet做的,我需要自己构建documnet,因为我需要集成Rights Management系统,我也为同样的目的编写了PDF。据我所知,对于常见的mime类型,您可以找到大量讨论文件结构的论文


有关midi格式,请参阅以下文档

每个midi都有一个特定于midi文件格式的头文件。它与bmp格式不同,因此对于每种情况,您都已阅读该文件的文档。例如,对于tga文件格式,您可以找到一些信息。对于MIDI,您可以找到更多信息

您找到的代码只是一个写头的快速破解,通常为每个头定义结构,以便其他人更好地理解每个字节的含义:

例如,这是用于读取tga文件的标题:

struct TGAHeader
{
    unsigned char       descriptionlen;
    unsigned char       cmaptype;
    unsigned char       imagetype;
    unsigned short      cmapstart;
    unsigned short      cmapentries;
    unsigned char       cmapbits;
    unsigned short      xoffset;
    unsigned short      yoffset;
    unsigned short      width;
    unsigned short      height;
    unsigned char       bpp;
    unsigned char       attrib;
};
在C++中,你必须非常小心地阅读这个结构,因为你可能会遇到对齐问题,在这里,你将如何阅读:

TGAHeader header;
fread(&header.descriptionlen,sizeof(header.descriptionlen),1,file);
//and so on for each header member.

“如何将十六进制写入文件”,就像您的示例代码一样。是否有一种方法可以手动预测要写入的十六进制值(除了标题)是;阅读文件格式的文档/规范。在互联网上搜索,一些格式可能有教程,用简单的术语解释结构。从文档中再次提到“了解其他文件格式(如EXE)如何”。可执行文件可能比其他示例更难理解。