2015-06-10 2 views
2

Есть ли правильный или обычный способ гарантировать, что тип данных будет sizeof 4?Гарантия Тип данных размер

Раньше я только что сделал несколько инструкций typedef, основанных на sizeof различных типов данных, и мне было интересно, есть ли более или более обычный метод иметь типы данных предварительно определенного размера на разных архитектурах?

Для этого вопроса можно сказать, что у меня есть большой массив символов, которые я прочитал из файла. Я хочу прочитать серию из 24 бит целых чисел из этого массива символов. В прошлом я выбрал массив для типа данных с размером моего желаемого типа данных, однако этот метод не работает, если нет примитивного типа данных с моим желаемым размером.

Каков наилучший способ справиться с этой ситуацией?

char x[10] = {1,1,1,1,1,1,1,1,1,1}; 
    uint32_t* y = (uint32_t*)x; 
    for(int i=0; i < 10; i++)std::cout << "y: " << y[i] << "\n"; 

    output: 
    y: 16843009 
    y: 16843009 
    y: 257 

    desired output: 
    y: 65793 
    y: 65793 
    y: 65793 
    .... 
+3

'uint32_t' не достаточно хорош? –

+0

Чтобы подробно описать комментарий @barakmanos, в [''] появилось множество целочисленных типов фиксированной ширины (http://en.cppreference.com/w/cpp/types/integer) – CoryKramer

+0

Если я прочитал 32-битный целые числа из списка из 24-битных целых чисел не будут отключены для всех моих значений? – Nick

ответ

0

Go старой школы и читать-байт, читать-байт, читать-байт-байт-байт!

uint32_t read24(unsigned char *& bufp) 
{ 
    uint32_t val; 
    val = *bufp++; 
    val |= *bufp++ << 8; 
    val |= *bufp++ << 16; 
    return val; 
} 

Использование:

unsigned char buffer[] = 
{ 0x2A, 0x00, 0x00, 0x9A, 0x02, 0x00, 0x4E, 0x61, 0xBC }; 
unsigned char * bufp = buffer; 
uint32_t A = read24(bufp); 
uint32_t B = read24(bufp); 
uint32_t C = read24(bufp); 

Почему беззнаковое char s? Самый простой способ справиться с расширением знака. Если вы используете подписал char с, вы должны делать маскировки, как это:

val = *bufp++ & 0xFF; 

содрать дополнительные биты знака.

И следите за концом. В зависимости от того, откуда ваши данные поступают, вам, возможно, придется читать все в другом направлении.

0

Для этого предназначен фиксированный тип uint32_t. Он будет построен из любого примитива, соответствующего вашей системе.

Вы можете найти его в <cstdint> или, pre-C++ 11, в Boost как <boost/cstdint.hpp>. C also provides a `которые могут быть полезны.

Неисправность этого, char[4]?