在C / C ++中以正确的方式在文件中写入字节[Endianess]

时间:2016-04-25 19:58:17

标签: c++ c fwrite endianness

我正在编写一个创建MIDI文件的程序,我试图在文件上写下midi消息。

我首先测试了使用函数fputc()从零开始创建文件并在每个字节输入所有文件的字节,并且进展顺利。

当我尝试同时写多个字节时(例如,将short intint写入文件),问题出现了,因为函数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)。

1 个答案:

答案 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;
}