【问题标题】:Understanding this code(writing hex direct to file- midi)理解此代码(将十六进制直接写入文件-midi)
【发布时间】:2025-12-14 23:20:07
【问题描述】:

我找到了这段代码,

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

【问题讨论】:

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

标签: c++ file-format


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    midi格式参考以下文档http://faydoc.tripod.com/formats/mid.htm

    【讨论】: