首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中设置FourCC值

在C++中设置FourCC值
EN

Stack Overflow用户
提问于 2009-05-01 13:34:37
回答 12查看 8.1K关注 0票数 6

我想在C++中设置一个FourCC值,即一个无符号的4字节整数。

我想最明显的方式是#定义,例如

代码语言:javascript
复制
#define FOURCC(a,b,c,d) ( (uint32) (((d)<<24) | ((c)<<16) | ((b)<<8) | (a)) )

然后:

代码语言:javascript
复制
uint32 id( FOURCC('b','l','a','h') );

你能想到的最优雅的方式是什么?

EN

回答 12

Stack Overflow用户

发布于 2009-05-01 13:41:08

您可以使用以下命令将其设置为编译时常量:

代码语言:javascript
复制
template <int a, int b, int c, int d>
struct FourCC
{
    static const unsigned int value = (((((d << 8) | c) << 8) | b) << 8) | a;
};

unsigned int id(FourCC<'a', 'b', 'c', 'd'>::value);

只需做一点额外的工作,就可以让它在编译时检查传入的每个数字是否在0到255之间。

票数 17
EN

Stack Overflow用户

发布于 2009-05-01 14:46:39

代码语言:javascript
复制
uint32_t FourCC = *((uint32_t*)"blah");

为什么不是这个呢?

编辑: int -> uint32_t。

不,它不会将字符**转换为uint32_t。它会将(char*)转换为(uint32_t*),然后解除对(uint32_t*)的引用。这不涉及字节顺序,因为它给uint32_tto分配了一个uint32_t。唯一的缺陷是对齐和I没有明确指出32位类型。

票数 10
EN

Stack Overflow用户

发布于 2014-12-15 19:36:37

通过使用C++11常量表达式,您可以编写类似以下内容:

代码语言:javascript
复制
constexpr uint32_t fourcc( char const p[5] )
{
    return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
}

然后将其用作:

代码语言:javascript
复制
fourcc( "blah" );

优点:

  • 更具可读性,
  • 如果字符串参数在编译时是已知的,则在编译时计算函数(没有运行时字符取决于字节顺序(即,参数的第一个字符将始终位于四个字符的最高有效字节中)。

缺点:

  • 需要c++11 (或更高版本)编译器。
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/811361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档