2013-04-22 5 views
0

Я пробовал свой мозг последние несколько часов, но мне нужна помощь. В значительной степени пытаюсь написать модель C для блокирующего кеша, который будет использоваться в проекте RTL. Я определил строку кэша в C как массив типов «char», чтобы сделать его байтовым адресом. Только трудность заключается в том, что я не могу для жизни меня фигурировать, как объединить четыре байта (символы) в 32-битный 'int' тип, который будет возвращен. Я пробовал все, что мог придумать, используя strcat, strncat, strcpy и т. Д., Но не повезло. strcat возвращает правильное значение, когда я массив символов заполняется фактическими символами, но он не ведет себя так, как требуется, когда используются числа (strcat возвращает только первый элемент, а не весь массив символов). Пример кода:конкатенировать символ до типа int

unsigned char aa[4] = {0}; 
char testet[2] = {1,0}; 
printf(" aa[0] = %d \n", aa[0]); 
printf(" aa[1] = %d \n", aa[1]); 
printf(" aa[2] = %d \n", aa[2]); 
printf(" aa[3] = %d \n", aa[3]); 
printf(" aaconcat as a 32b word is %u \n", *strncat(aa, testet,2)); 
printf(" aaconcat as a 32b word is %u \n", *strncat(aa, testet,1)); 
printf(" aa[0] = %d \n", aa[0]); 
printf(" aa[1] = %d \n", aa[1]); 
printf(" aa[2] = %d \n", aa[2]); 
printf(" aa[3] = %d \n", aa[3]); 

Возвращает:

aaconcat as a 32b word is 1 
aaconcat as a 32b word is 1 
aa[0] = 1 
aa[1] = 2 
aa[2] = 1 
aa[3] = 0 

Хотя я ожидал {testet [0], testet [1], testet [0]} = 131330.

+0

Почему вы ожидаете, что выход? – user1167662

+1

будет 131330 эквивалентно «конкатенации» символа 'char' со значениями 2, 1 и 2? – user1167662

+0

0x0010201 - 66049 в десятичной системе – 2013-04-22 03:35:53

ответ

0

если вы пытаясь объединить фактические биты, которые, как я подозреваю, вы пытаетесь сделать, учитывая ожидаемый результат от {testet[0],testet[1],testet[0]} = 131330, попробуйте что-то вроде этого, чтобы объединить char s:

Предполагается, что char s, которые вы хотите объединить, хранятся в unsigned char chararr[4].

long int chars_in_int = 0; 
for (int i = 0; i < 4; i++) { 
    chars_in_int << 8; /* redundant on first loop */ 
    chars_in_int += chararr[i]; 
} 

Это поместит char с с самым низким индексом в chararr в наиболее значимых битов chars_in_int.

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