Delphi MAKEFOURCC troubles



我正在与以下代码作斗争:

MAKEFOURCC('R','I','F','F');

该函数是C++的翻译,在Delphi中应该是这样的:

function MAKEFOURCC(const ch0: AnsiChar;
const ch1: AnsiChar;
const ch2: AnsiChar;
const ch3: AnsiChar): FOURCC; inline;
begin
Result:= DWORD(Ord(ch0)) or
(DWORD(Ord(ch1)) shl 8) or
(DWORD(Ord(ch2)) shl 16) or
(DWORD(Ord(ch3)) shl 24);
end;

现在,这将导致(big-endian(46464952美元,这是错误的。应该是52494646美元。

看看微软的解释,这个宏的代码是:

#define MAKEFOURCC(ch0, ch1, ch2, ch3)   
((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) |   
((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ));

颠倒ch3、ch2、ch1和ch0的顺序会得到正确的值:

Result:= DWORD(Ord(ch3)) or
(DWORD(Ord(ch2)) shl 8) or
(DWORD(Ord(ch1)) shl 16) or
(DWORD(Ord(ch0)) shl 24);

现在我在这里错过了什么?提前谢谢。

我认为您误解了endianes对结果FOURCC值的影响。

您声明464649552美元是"错误的"结果,但这是正确的结果,基于Microsoft的文档:https://learn.microsoft.com/en-us/windows/win32/directshow/fourcc-codes

请注意,这突出了Windows的小端序特性,结果是字符串"YUY2"的FOURCC编码实际上是2YUY。当编码为32位数字字节时,与端序不可知的字符串表示相比,顺序颠倒。

YUY2的FOURCC编码为59555932美元,当对little-endian表示进行反转时,产生32595559美元,这是从您文章中MAKEFOURCC()的原始和字面实现中获得的结果。

即你认为错误的结果实际上是正确的。

特定文件格式中存储表示的要求通常与内存中的表示无关。WAV头(实际上通常是FourCC规范(需要Big Endian表示,这一事实并不能改变您最初的MakeFourCC实现是正确的。这只是意味着在WAV头块中存储FourCC时还需要反转字节。

最新更新