Как преобразовать массив int8_t в массив int32_t в C - PullRequest
1 голос
/ 19 июня 2019

У меня есть массив, и я хочу преобразовать его в массив int32_t.

Я попробовал код ниже.

int32_t const_data[11];
int8_t buffer[44];

    int k = 0;
    while (k < 11) {
        for (int j = 0; j < 44; j++) {
                const_data[k] = bf.buffer[j];
                k++;
        }
    }

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Самый простой и простой способ - использовать union

#define array_size_int32    11
#define array_size_int8     44

typedef union{
    int32_t const_data[array_size_int32];
    int8_t buffer[array_size_int8];
}my_union_t;

Пример использования:

/* initialize union members */
my_union_t my_union = {
    .const_data = {
        0x12345678,
        0x12345678,
        0x12345678,
        0x12345678,
        0x12345678,
        0x12345678,
        0x12345678,
        0x12345678,
        0x12345678,
        0x12345678,
        0x12345678,
    },
};

Пример способа печати:

uint8_t i;

for(i = 0; i < array_size_int8; i++){

    /* mask off sign extension bits */
    printf("my_union.buffer[%d] = %x\n", i, my_union.buffer[i] & 0xff);

}

Вы можете попробовать код здесь

EDIT:

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

Например,

#define array_size_int32    10    //40 bytes
#define array_size_int8     45    //45 bytes
0 голосов
/ 19 июня 2019

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

#include <stdio.h>
#include <inttypes.h>
int main(){
    int8_t input[] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
    int32_t output[10];
    int count=0;
    for(;count<sizeof(input);count+=sizeof(int32_t)/sizeof(int8_t)){
        output[count] = (int32_t)(*(int32_t*)(&input[count]));
        printf("%x:%x\n",input[count],output[count]);
    }
    return 0;
}

Примечание: как указано @tadman в комментарии. Вы также должны учитывать порядковый номер вашей платформы. Это решение хорошо работает для моей проблемы на платформе, на которой я работал. В зависимости от вашей платформы вам может понадобиться настроить это.

Живой код

...