Задать вопрос
@Robotex

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

Взгляните на структуру 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;
}


Я в растерянности. Кто-нибудь может объяснить мне, как записать в тот массив большой размер данных?
  • Вопрос задан
  • 2831 просмотр
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@al_one
struct fp_print_data *CFingerprintScanner::byteArrayToFpdata(QByteArray byteArray)
{
return (struct fp_print_data *)byteArray.data();
}

(Но необходимо следить за временем жизни byteArray).

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

Войдите, чтобы написать ответ

Похожие вопросы