Изменение размера статического массива (с потерей данных)

Взгляните на структуру struct fp_print_data
enum fp_print_data_type {
        PRINT_DATA_RAW = 0, /* memset-imposed default */
        PRINT_DATA_NBIS_MINUTIAE,
};

struct fp_print_data {
        uint16_t driver_id;
        uint32_t devtype;
        enum fp_print_data_type type;
        size_t length;
        unsigned char data[0];  // Здесь массив из одного элемента
};

Но когда я сканирую отпечаток пальца, размер этого массива составляет 2404 байта. Как он изменяет свой размер?
Я портирую libfprint (эти структуры взяты оттуда без изменений) на qt4 и мне необходимо трансформировать эту структуру в QByteArray и обратно. Я успешно записал данные в byteArray, но мне трудновато выполнить обратную процедуру. Взгляните на функцию:

struct fp_print_data CFingerprintScanner::byteArrayToFpdata(QByteArray byteArray)
{
    quint16 driver_id;
    quint32 devtype;
    quint32 type;
    quint64 length;
    char * data;

    struct fp_print_data fpdata;

    QBuffer buffer(&byteArray);
    buffer.open(QIODevice::ReadOnly);

    QDataStream in(&buffer);

    in >> driver_id;
    in >> devtype;
    in >> type;
    in >> length;

    data = (char *) malloc(length);

    in.readRawData(data, length);

    fpdata.driver_id = (uint16_t) driver_id;
    fpdata.devtype = (uint32_t) devtype;
    fpdata.type = (enum fp_print_data_type) type;
    fpdata.length = (size_t) length;

    // вот здесь мне нужно записать data в fpdata.data, но как это можно сделать?
    // ведь невозможно преобразовать char * (или unsigned char*) в unsigned char[0]
    // я перерыл всю библиотеку, но не нашел места, в котором они делают такое преобразование

    free(data);

    return fpdata;
}

Я в растерянности. Кто-нибудь может объяснить мне, как записать в тот массив большой размер данных?

0
Eugene - 8 Март, 2011 - 09:17
Изображение пользователя Eugene.

Как то так, если я не ошибаюсь...
memcopy(fpdata.data, data, length);

А вот пример использования функции memcopy() из Википедии:
#include <string.h>

unsigned int  array[512];                 // источник
unsigned char byte_array[sizeof(array)];  // буфер назначения

memcpy(byte_array, array, sizeof(array));

Отправить комментарий

CAPTCHA на основе изображений
Введите цифры