Delphi MAKEFOURCC的麻烦

我正在为此代码苦苦挣扎:

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);

现在我在这里想念什么? 预先感谢。

jacod2980 回答:Delphi MAKEFOURCC的麻烦

我认为您误解了字节序对最终FOURCC值的影响。

您声明$ 46464952是“错误”结果,但它是正确结果,根据Microsoft这里的文档:https://docs.microsoft.com/en-us/windows/win32/directshow/fourcc-codes

请注意,这突出了Windows的低位优先性质,其结果是字符串'YUY2'的FOURCC编码实际上为2YUY。与字节序无关的字符串表示形式相比,当编码为32位数字字节顺序时,顺序相反。

YUY2的FOURCC编码为$ 59555932,如果反转以小尾数表示形式,则会得到$ 32595559,这是从帖子中MAKEFOURCC()的原始和文字实现中获得的结果。

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

特定文件格式的存储表示形式的要求通常独立于内存中表示形式。 WAV标头(通常甚至是FourCC规范)都需要Big Endian表示,这一事实并不能改变您原来的MakeFourCC实现正确的事实。这只是意味着在将FourCC存储在WAV标头块中时,还需要反转字节。

本文链接:https://www.f2er.com/3088152.html

大家都在问