2015-03-05 2 views
-4

Я новичок в языке c и имею некоторые проблемы с программой. У меня 3 массива size = 8;C программирование для массивов

u8 a [size]; // a = 0x0D 
    u8 b [size]; // b= 0xDE 
    u16 new_buffer[size]; // i want to see as 0xDE0D on the terminal 

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

u8 SendBuffer[BUFFER_SIZE]; 
u8 RecvBuffer[BUFFER_SIZE]; 
u16 Buffer[BUFFER_SIZE]; 

int main(void) { 
    RecvBuffer[0] = 0x00; 
    RecvBuffer[1] = 0x0D; 

    if (Status != XST_SUCCESS) { 
     return XST_FAILURE; 
    } 
    printf("Sensor data is = 0x%x \n\r", RecvBuffer[0]); 
    printf("---Data received successfully---\n\r"); 
    return 0; 
} 

Благодаря

+3

Можете ли вы показать некоторые из кода вы пробовали? Показывать попытку, которую вы сделали, часто приводят к более полезным и предстоящим ответам – Toby

+0

u8 SendBuffer [BUFFER_SIZE]; u8 RecvBuffer [BUFFER_SIZE]; u16 Буфер [BUFFER_SIZE]; int main (void) { RecvBuffer [0] = 0x00; \t RecvBuffer [1] = 0x0D; \t \t если (Status = XST_SUCCESS!) \t { \t \t возвращение XST_FAILURE; \t} \t \t printf ("Данные датчика = 0x% x \ n \ r", RecvBuffer [0]); printf ("--- Данные получены успешно --- \ n \ r"); \t возвращение 0; } – nsh

+2

Arghhh, отредактируйте вопрос, этот код, который вы опубликовали в качестве комментария, действительно уродлив. –

ответ

1

Обратите внимание, что u8 не является частью стандарта, вы имеете в виду uintX_t, и эти значения не являются массивы, но переменные:

uint8_t a = 0X0D; 
uint8_t b = 0XDE; 
uint16_t new_buffer = ((uint16_t)b << 8) | a; 

Как указано @WeatherVane, вам необходимо отменить эти значения, если вы находитесь под большим аргументом:

uint16_t new_buffer = ((uint16_t)a << 8) | b; 
+0

Я программирую в Xilinx SDK, поэтому u8 его неподписанное 8-битное целое число, выход im получает 2 8-битных шестнадцатеричных данных, так как 0D и DE я хочу видеть их как полные 16-битные данные в одном названии new_buffer – nsh

+1

Это именно то, что @AlterMann предоставил здесь. Просто измените 'uint8_t' на' u8' и 'uint16_t' на' u16' – Toby

+0

Спасибо. В общем, может быть, например, мне кажется, что у меня есть 2 8-битные переменные, и мне нужно скопировать это в 16-битную переменную. как это сделать? и как я могу перемещать данные переменной влево или вправо? Я читал книгу, но получал некоторые недоумения. Было бы хорошо, если бы я получил просто случайный пример, чтобы очистить мой conecpt. – nsh

2

Две версии здесь, в зависимости от порядок байтов

for (i=0; i<BUFFER_SIZE; i++) { 
    // little endian 
    new_buffer[i] = (u16)a[i] << 8 | (u16)b[i]); 

    // big endian 
    new_buffer[i] = (u16)b[i] << 8 | (u16)a[i]); 

    // bit shift 
    new_buffer[i] >>= 3; 
} 

Или, чтобы вращать буфер 3 бита вправо

u16 bits, prev = 0; 
for (i=0; i<BUFFER_SIZE; i++) { 
    bits = new_buffer[i]; 
    new_buffer[i] = bits >> 3 | prev; 
    prev = bits << (sizeof(u16)*8 - 3); 
} 
+0

Хорошая точка !!, я пропустил континент, но почему '>> 3'? Я этого не понимаю. –

+1

@AlterMann, потому что OP говорит * ", а затем сдвиг вправо' new_buffer' на три бита * * (но он мог означать * "и перейти к следующему элементу" *). –

+0

К сожалению, я не читал этого, теперь это имеет смысл, спасибо –

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