2015-06-08 5 views
1

Как мы можем преобразовать 8-байтовый массив символов, так как << не работает для типа long?Преобразование 8 байтов массива символов в длинные

#define word_size 8 

long num = 0; 
char a[word_size] = "\x88\x99\xaa\x0bb\xcc\xdd\xee\xff"; 

for (i=0; i < word_size;i++) { 
    a[(word_size-1) - i] |= (num << (8*(word_size - i - 1))) & 0xFF; 
} 

printf("%lx\n", num); 
+1

'<<' отлично работает с 'long'. В этом случае 'num' всегда равно 0, и поэтому вы очищаете' a' ко всем 0s. – rici

+2

'long' не обязательно 64 бит. Если вы хотите убедиться, используйте 'int64_t' из' stdint.h'. Это предложенный путь. Кроме того, убедитесь, что массив имеет правильный порядок байтов. – Olaf

ответ

3

Следующий код является более эффективным:

unsigned char[word_size] = ...; 
int64_t num = 0; 
for (int i = 0 ; i < sizeof(a) ; i++) 
    num = (num << 8) | a[i]; 

Это предполагает большой Endian (наивысший порядок байт первый) порядок байтов в массиве. Для небольшой Endian (как вы, кажется, использовать) только обрабатывать его сверху вниз:

for (int i = sizeof(a) ; --i >= 0 ;) 

Примечание: char подписан ли или без знака зависит от конкретной реализации, так пригвоздить его вниз, чтобы быть без знака, в противном случае логическое или не будет работать. Лучше использовать uint8_t; который определяется как 8 бит, а char - не.

Примечание: для констант следует использовать все-верхний регистр: WORD_SIZE вместо word_size. Это общепринятый стандарт (вполне единственный случай для идентификаторов в C).

+0

Спасибо за это, я пытался преобразовать 8-байтовый массив символов в длинный длинный, и это был единственный способ сделать так, чтобы я мог найти. –

+1

@DaveCole: Я рад, что это помогло. Просто помните, чтобы быть осторожным при смещении подписанных значений. Обычно я рекомендую использовать типы 'unsigned' только для переключения. Также обратите внимание, что 'long long' не требуется иметь 64 бита, а байт /' char' (см. Текст) также не должен иметь 8 бит. Использование правильных типов делает ваш код более самодокументированным. Даже если это не производственный код, вы можете оценить это через несколько лет. – Olaf