The mmioFOURCC macro converts four characters into a four-character code.
这个宏转换四个字符到一个四字符代码
FOURCC mmioFOURCC( CHAR ch0, CHAR ch1, CHAR ch2, CHAR ch3 );
Parameters
ch0
First character of the four-character code.
ch1
Second character of the four-character code.
ch2
Third character of the four-character code.
ch3
Fourth character of the four-character code.
Return Values
Returns the four-character code created from the given characters.
Remarks
This macro does not check whether the four-character code it returns is valid.
The mmioFOURCC macro is defined as follows:
#define mmioFOURCC(ch0, ch1, ch2, ch3) \ MAKEFOURCC(ch0, ch1, ch2, ch3);
The MAKEFOURCC macro, in turn, is defined as follows:
#define MAKEFOURCC(ch0, ch1, ch2, ch3) \ ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \ ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ));
Requirements
Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Mmsystem.h; include Windows.h.
http://msdn.microsoft.com/en-us/library/ms712167
相关代码:
mmioFOURCC('W','A','V','E');
/* MMIO macros */
#define mmioFOURCC(ch0, ch1, ch2, ch3) MAKEFOURCC(ch0, ch1, ch2, ch3)
#define MAKEFOURCC(ch0, ch1, ch2, ch3) \
((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \
((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ))
上面翻译时搞不大清楚,但是从这里的代码可以看的很准确,它是把四个字符(注意第一句代码中用的是单引号)转换成一个四字节的DWORD类型的编码.
下面把这个位运算理一下:
'W':八进制是127,十六进制是0x57,十进制是87,表示成二进制是0101 0111
'A':八进制是101,十六进制是0x41,十进制是65,表示成二进制是0100 0001
'V':八进制是126,十六进制是0x56,十进制是86,表示成二进制是0101 0110
'E':八进制是105,十六进制是0x45,十进制是69,表示成二进制是0100 0101
它们都被强制转换为(DWORD)(BYTE)
BYTE,实际就是typedef unsigned char BYTE;
DWORD,实际就是typedef unsigned long DWORD;,这个不重要,关键是DWORD占四字节,重点在这儿.
(DWORD)(BYTE)(ch0):0000 0000 0000 0000 0000 0000 0101 0111
(DWORD)(BYTE)(ch1):0000 0000 0000 0000 0000 0000 0100 0001
(DWORD)(BYTE)(ch2):0000 0000 0000 0000 0000 0000 0101 0110
(DWORD)(BYTE)(ch3):0000 0000 0000 0000 0000 0000 0100 0101
(DWORD)(BYTE)(ch0) :0000 0000 0000 0000 0000 0000 0101 0111 W
((DWORD)(BYTE)(ch1) << 8) :0000 0000 0000 0000 0100 0001 0000 0000 A
((DWORD)(BYTE)(ch2) << 16) :0000 0000 0101 0110 0000 0000 0000 0000 V
((DWORD)(BYTE)(ch3) << 24 ) :0100 0101 0000 0000 0000 0000 0000 0000 E
这样它们的有用的信息各自占了8位,按位或运算后,就变成一个整体了.
但是直观的看,这样顺序又反了,可能还是大头小头作怪吧,这个实在搞不懂哦,好几次了.
下面用一个简单的代码写入文件进行测试.
以下为测试:#include "stdafx.h"
#include "Windows.h"
#include "Mmsystem.h"
#pragma comment(lib, " Winmm.lib")
int main(int argc, char* argv[])
{
printf("Hello World!\n");
FILE * h = fopen("c:\\pp.t","wb+");
DWORD tmp = mmioFOURCC('W','A','V','E');
fwrite(&tmp,sizeof(DWORD),1,h);
fclose(h);
return 0;
}
它会在C盘生成一个文件pp.t,用记事本打开,会显示WAVE,用二进制查看器打开,如下:
