将 MIDI 文件轨道长度写入 32 位十六进制值 (Objective-C)



我使用以下代码将十六进制数字写入 MIDI 文件。这是为了指定轨道长度 - MIDI 格式需要一个 32 位十六进制值。

这是我正在使用的代码,其中"length"存储 MIDI 轨道中的字节数 -

int length;
char lenShort[3] = { 0x00, 0x00, 0x00 };
char lenLong[2] = { 0x00, 0x00 };
// create length 32-bit hex
if (length>255) {
    [contents appendBytes:&lenLong length:2];
    [contents appendBytes:&length length:2];
} else {
    [contents appendBytes:&lenShort length:3];
    [contents appendBytes:&length length:1];
}

它适用于低数字 - 例如,当 length=57 时,它会以十六进制吐出00000039,这很好。

但是对于更高的数字,例如 length=295,它给了我这个 - 00002701,这是错误的(十进制是 9985)。

我发现我需要反转最后两个字节 - 我一直在尝试各种"无符号长整型"和0xFFFFFFF的事情,但我真的不知道我在做什么,没有任何效果(我没有注意学校的十六进制课!

有人可以给我一种简单的方法(在 C 或 Obj-C 中)来切换最后两个字节吗?

如果我

没看错,你想把长度写成大端字节顺序的 32 位整数。这可以简单地完成为:

int length = ...
uint32_t lengthBE = OSSwapHostToBigInt32(length);
[contents appendBytes:&lengthBE length:4];

最新更新