Установите значение FourCC в C++

Попробуйте этот сложный фильтр:

<quer:filtering xmlns:quer="http://www.taleo.com/ws/integration/query">
    <quer:greaterThan>
        <quer:field path="AcceptedDate"/>
        <quer:castAsDate>
            <quer:addDays>
                <quer:date type="now"/>
                <quer:integer>-7</quer:integer>
            </quer:addDays>
        </quer:castAsDate>
    </quer:greaterThan>
</quer:filtering>
5
задан Brian Tompsett - 汤莱恩 4 November 2015 в 19:53
поделиться

9 ответов

uint32_t FourCC = *((uint32_t*)"blah");

Why not this?

EDIT: int -> uint32_t.

And no it does not cast a char** to uint32_t. It casts a (char*) to (uint32_t*) then dereferences the (uint32_t*). There is no endian-ness involved, since its assigning an uint32_tto an uint32_t. The only defects are the alignment and the I hadn't explicitly indicated a 32bit type.

9
ответ дан 18 December 2019 в 05:23
поделиться

Вы можете сделать его постоянной времени компиляции, используя:

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.

16
ответ дан 18 December 2019 в 05:23
поделиться

или сделайте то же самое с помощью встроенной функции

inline uint32_t FOURCC(uint8_t a, uint8_t b, uint8_t c, uint8_t d)
{
     return ( (uint32) (((d)<<24) | (uint32_t(c)<<16) | (uint32_t(b)<<8) | uint32_t(a)) )
} 

и избегайте головной боли макроса, но в остальном ваш подход мне подходит.

5
ответ дан 18 December 2019 в 05:23
поделиться

Вместо #define я бы, вероятно, поместил почти такой же код и использовал бы встроенный компилятор.

0
ответ дан 18 December 2019 в 05:23
поделиться

Если я не ошибаюсь, вы можете просто использовать многозначные символьные константы для этого права?

unsigned int fourCC = 'blah';

Это совершенно верно в спецификации ANSI / ISO, хотя некоторые компиляторы будут немного жаловаться. Вот как типы ресурсов использовались в старых API Macintosh.

3
ответ дан 18 December 2019 в 05:23
поделиться

Если постоянная времени компиляции не требуется, возможно, самая последняя из них -

unsigned int FourCCStr(const char (&tag)[5])
{
    return (((((tag[3] << 8 ) | tag[2]) << 8) | tag[1]) << 8) | tag[0];
}

#define FOURCC(tag) FourCCStr(#tag)

unsigned int id(FOURCC(blah));

. Принимает только теги из четырех символов, как требуется.

1
ответ дан 18 December 2019 в 05:23
поделиться

Я не вижу ничего плохого в вашем алгоритме. Но для чего-то подобного я бы просто написал функцию вместо макроса. Макросы имеют множество скрытых функций / проблем, которые могут со временем вас укусить.

uint FourCC(char a, char b, char c, char d) { 
  return ( (uint32) (((d)<<24) | ((c)<<16) | ((b)<<8) | (a)) );
}
1
ответ дан 18 December 2019 в 05:23
поделиться

Предполагая Windows (поскольку FOURCC является концепцией Windows), Win API уже предоставляет mmioStringToFOURCC и mmioFOURCC .

1
ответ дан 18 December 2019 в 05:23
поделиться
uint32 fcc(char * a)
{   
    if( strlen(a) != 4)
        return 0;       //Unknown or unspecified format

    return 
    (
            (uint32) 
            ( 
                ((*(a+3))<<24) |
                ((*(a+2))<<16) |
                ((*(a+1))<<8) | 
                (*a)
            )       
    );
}
-1
ответ дан 18 December 2019 в 05:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: