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

将MIDI文件磁道长度写入32位十六进制值(Objective-C),objective-c,hex,decimal,swap,midi,Objective C,Hex,Decimal,Swap,Midi,我使用以下代码将十六进制数字写入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 appendBy

我使用以下代码将十六进制数字写入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];
}
它可以很好地处理较小的数字-例如,当长度=57时,它以十六进制输出00000039,这很好

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

我发现我需要反转最后两个字节——我一直在尝试各种各样的“无符号长”和0xFFFFFFF的东西,但我真的不知道我在做什么,什么都不起作用(我在学校的十六进制课上没有注意!)


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

如果我看对了,你想把长度写为 以大端字节顺序排列的32位整数。这可以简单地通过以下方式实现:

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

如果我看对了,你想把长度写为 以大端字节顺序排列的32位整数。这可以简单地通过以下方式实现:

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

你说的“十六进制”是什么意思?这是一个数字的字符串表示形式,我不相信它在MIDI文件中使用。by hex-我指的是MTRK头的“length参数”,它以字节为单位,格式为xx xx xx xx xx xx,你说的“hex”是什么意思?这是一个数字的字符串表示形式,我不相信在MIDI文件中会用到它