我正在编写一个创建MIDI文件的程序,我试图在文件上写下midi消息。
我首先测试了使用函数fputc()
从零开始创建文件并在每个字节输入所有文件的字节,并且进展顺利。
当我尝试同时写多个字节时(例如,将short int
或int
写入文件),问题出现了,因为函数fwrite()
放了字节向后。
例如:
FILE* midiFile;
midiFile = fopen("test.mid", "wb");
short msg = 0x0006;
fwrite(msg, sizeof(msg), 1, midiFile);
fclose(midifile);
输出写入文件的0x06为0x00,而不是预期的:0x00,0x06。
我读到了这一点,并发现它是由 endianness 引起的;我的英特尔处理器使用 little endian ,因此它向后写入大于1字节的变量(与 big endian 机器相比)。
我仍然需要纠正它并按照我想要开发程序的方式编写字节。
我的编译器没有识别像htonl()
或类似的功能(我不知道为什么),但我想问一个方法,或者如何写{{1 char数组上的{' s和short
(特别是int
' s)。
答案 0 :(得分:1)
按顺序写下你想要的字节,一次一个......
或在写入之前交换字节。
uint8_t msbyte = msg >> 8;
uint8_t lsbyte = msg & 0xFF;
uint8_t buffer[2];
// Big Endian
buffer[0] = msbyte;
buffer[1] = lsbyte;
/* Little endian
buffer[0] = lsbyte;
buffer[1] = msbyte;
*/
fwrite(&buffer[0], 1, sizeof(buffer), midiFile);
交换字节:
uint16_t swap_bytes(const uint16_t value)
{
uint16_t result;
result = value >> 8;
result += (value & 0xFF) << 8;
return result;
}