2010-01-22 2 views
1

Используя с, я определил байт и слово следующим образом:Как конвертировать из массива байтов в массив слов в с

typedef unsigned char byte; 
typedef union { 
    byte b[4]; 
    unsigned long w; 
} word; 

Это позволяет мне легко идти от слов к байтам, но я не Конечно, хороший способ пойти другим путем. Возможно ли сделать что-то вроде приведения из байта * в слово * или мне нужно придерживаться итеративного копирования байтов в слова?

+0

Непонятно, что именно вы пытаетесь сделать. Если вы хотите, чтобы байтовые значения содержали слово, затем наведите указатель на указатель байта. Для обратного, нарисуйте указатель байта на указатель слова, но только если вы знаете, что байты правильно выровнены. –

+0

Вы хотите, чтобы каждый отдельный байт был растянут в слово или вы хотите, чтобы 4 байта составляли слово? – thomaspaulb

+0

Я хочу последнего. Поэтому, если у меня есть 16 байт, он сделает 4 слова из 4 байтов. Я также нуждаюсь в нем, чтобы иметь возможность правильно массива pad, который не имеет кратного 4 байта. – giroy

ответ

3

Одна из великих и ужасных вещей о c - вы можете взять указатель на пустоту и бросить ее на что угодно. Пока вы знаете, что вы делаете, это будет работать, но не то, к чему вы хотите привыкнуть.

1
const byte input[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; 
unsigned long output[sizeof(input)/sizeof(unsigned long)]; 
memcpy(output, input, sizeof(input)); 
+0

Этот ответ более надежный, чем вопрос, так как он может работать, даже если unsigned long имеет разный размер, чем 4. Но опасно, если кто-то вручит оригинальную плакат байтовым массивом, длина которого не кратная sizeof (unsigned long). –

+0

Правильно, поэтому '(sizeof (input) + sizeof (unsigned long) - 1)/sizeof (unsigned long)' более безопасен, но я был ленив и вместо этого написал короткий путь ;-) – ephemient

Смежные вопросы