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

Understanding this code(writing hex direct to file- midi)

本文关键字:文件 -midi 十六进制 代码      更新时间:2023-10-16

我找到了这段代码,

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 是独一无二的,因为它是由函数/变量编译的,而不仅仅是像素文件或声音值?

每个 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.

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

有关 MIDI 格式,请参阅以下文档 http://faydoc.tripod.com/formats/mid.htm