十六进制值的 MIDI 文件

MIDI Files in Hex Value

我是编程初学者 有没有办法以十六进制数读取 midi 文件?

我在网上查了一下,midi文件都是由文件头组成的,内容都是十六进制的,比如 4D 54 68 64 0A ....

那么,从 MIDI 文件中提取这些十六进制数字的最佳方法是什么?如果有一个 C++ 库可以做到这一点? (我想用C++语言写程序)

对于上下文,我想将这些十六进制数字放入一个数组中并替换其中一些十六进制数字(当然根据 midi 文件格式,因此 midi 文件没有损坏)并将其保存回midi 文件。就像做某种隐写术

告诉你一个秘密:你的电脑里没有十六进制数。也没有小数。您计算机中的所有数字都以二进制形式存储。每当你在代码中写一个像 95 这样的十进制数时,C++ 所做的就是在内部将其转换为二进制并将其作为 1011111.

写入磁盘

因此,您要解决的问题需要 re-phrased。您不想读取十六进制数字,而是想在代码中将数字指定为十六进制(而不是像通常那样指定为十进制)。

指定十六进制数的方法有很多种。您可以使用计算器将数字从十六进制转换为十进制,然后在代码中指定该十进制数(例如,十六进制数 4D4 * 16 + 13 == 77。因此,当您读取一个数字后,您可以做 if (theNumber == 77) ...).

但是,由于在编程中用十进制和十六进制写数字是很常见的事情,所以C++实际上内置了一种写十六进制数字的方法。您在开头用 0x 写下您的十六进制数。所以要用十六进制写 77,你会写 0x4D。因此,一旦您从文件中读取了数字,您就会执行类似 if (theNumber == 0x4D) ....

的操作

在 C++ 中,您还可以在其他基数中指定数字。二进制数有 0b(以便准确指定数字在磁盘上的位置),如果数字仅以 0 开头,C++ 认为它是八进制的。所以要小心,不要在你的十进制数字前加上零!因为 010 == 8,它不是 10 !

至于实际从文件中读取数据,您可以使用 fread() 函数。