理解此代码(将十六进制直接写入文件-midi)
Understanding this code(writing hex direct to file- midi)
我找到了这段代码,
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
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 音频插件.将 MIDI 映射到音频文件
- 从 midi 文件读取字节时出现问题
- 理解此代码(将十六进制直接写入文件-midi)
- (C++)特定位数的整数(MIDI文件)
- 选择并执行Qt中QListWidget上显示的MIDI文件
- 在FMOD中改变MIDI或WAV/MP3文件的速度
- 读取midi文件
- c++ MIDI文件更改工具
- 阅读midi文件