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

Car*_*kal 1 midi hex swap decimal 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];
}
Run Code Online (Sandbox Code Playgroud)

它适用于低数字 - 例如,当长度= 57时,它以十六进制形式吐出00000039,这很好.

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

我发现我需要反转最后两个字节 - 我一直在尝试各种'unsigned longs'和0xFFFFFFF的东西,但我真的不知道我在做什么,没有什么工作(我没有'在学校的十六课上注意!)

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

Mar*_*n R 5

如果我看到它正确,你想要以big-endian字节顺序将长度写为32位整数.这可以简单地完成:

int length = ...
uint32_t lengthBE = OSSwapHostToBigInt32(length);
[contents appendBytes:&lengthBE length:4];
Run Code Online (Sandbox Code Playgroud)