理解这段代码(将十六进制直接写入file-midi)

时间:2014-02-07 12:26:00

标签: 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,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在功能/变量的编译意义上是独一无二的,而不仅仅是像素文件或声音值?

2 个答案:

答案 0 :(得分:2)

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

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

例如,这是用于读取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.

答案 1 :(得分:0)

对于任何文件都有一个能够从应用程序中读取的结构,基本上你可以直接把所有内容写入文件,如果你知道文件的结构,我是为办公室documnet做的,我需要构建documnet我的文件自我,因为我需要整合权利managemnet系统,我也写了同样的PDF。我知道,对于常见的哑剧类型,你可以找到大量讨论文件结构的论文。

对于midi格式,请参阅以下文档http://faydoc.tripod.com/formats/mid.htm