Чтение метаданных файла TDMS с помощью C - PullRequest
0 голосов
/ 16 января 2019

У меня есть вопрос о чтении файла Ntd .tdms ....

Я прочитал внутреннюю структуру формата файлов TDM на веб-сайте NI. и я написал несколько кодов для преобразования файлов .TDMS в файлы .txt.

(http://www.ni.com/white-paper/5696/en/#toc2)

Я попытался открыть файл .tdms с помощью программы hex-edit, Python-кодов, и мне помогли другие великие люди.

(https://github.com/petebachant/pyTDMS/blob/master/pytdms.py)
(https://cboard.cprogramming.com/c-programming/176922-reading-specific-data-tdms-files-save-text-file.html)

Наконец, я понимаю двоичную структуру файла TDMS . Это можно описать так.

(данные отведения) -> (метаданные) -> (исходные данные) -> (данные отведения) -> .... -> Конец файла

Аналогично, метаданные имеют собственную структуру. Было бы так. (номер объекта) -> (Объект) -> (Свойства)

Настоящая проблема в том, что ... Когда я читаю метаданные, все идет хорошо, пока не встретим следующее предложение ...

"Если индекс необработанных данных этого объекта в этом сегменте точно совпадает с индексом того же объекта, который был в предыдущем сегменте, 32-разрядное целое число без знака (0x0000000) будет сохранено вместо информации индекса."

Я хотел бы получить ниже коды в C ... но я не знаю, как ... C

из строки 216 ~ (https://github.com/petebachant/pyTDMS/blob/master/pytdms.py)

elif (rawdataindex==0x00000000):
    rawdata = object_rawdata[objectpath]

И вот как я это сделал. Я использовал много «если» ... все равно это не работает ..

Мой вопрос, есть ли лучший способ справиться с этим?

из строки 178 ~

uint32_t rawdataidx;
                    fread(&rawdataidx, sizeof rawdataidx, 1, f);
                    printf("rawdataidx : %" PRIu32 "\n", rawdataidx);

                    printf("af pos rawdataidx : %" PRIu32 "\n", ftell(f));

                    if (rawdataidx == 0xFFFFFFFF)
                    {
                        printf("There is no rawdata for this\n");
                    }
                    else if (rawdataidx == 0) // if the rawdataindex is  0x00000000 this will work....
                    {
                        printf("dataType : %" PRIu32 "\n", prevdatatype);

                        if (prevdatatype == tdsTypeSingleFloat) { // 더블
                            Datatype_Float = 1;
                            fprintf(files[fileidx], "Datatype_Float \n");
                            objrawcnt++;
                        }
                        else if (prevdatatype == tdsTypeDoubleFloat) { // 더블
                            Datatype_Double = 1;
                            fprintf(files[fileidx], "Datatype_Double \n");
                            objrawcnt++;
                        }
                        else {
                            printf("what im gonna do...\n");
                            return 0;
                        }
                        printf("Dimensionrawarray: %" PRIu32 "\n", prevDimensionarray);

                        printf("numrawdata: %" PRIu32 "\n", prevnumrawdata);

                        numraw = prevnumrawdata;

                        fprintf(files[fileidx], "%d \n", numraw);

                    }
                    else
                    {
                        rawobjcnt++;
                        uint32_t dataType = 0;
                        fread(&dataType, sizeof dataType, 1, f);
                        printf("dataType : %" PRIu32 "\n", dataType);
                        prevdatatype = dataType;
                        if (dataType == tdsTypeVoid) {            //보이드
                                                                  //goto TYPEVOID;
                            //TYPEVOID:;

                        }
                        else if (dataType == tdsTypeSingleFloat){ // 더블
                            Datatype_Float = 1;
                            fprintf(files[fileidx], "Datatype_Float \n");
                            objrawcnt++;
                        }
                        else if (dataType == tdsTypeDoubleFloat){ // 더블
                            Datatype_Double = 1;
                            fprintf(files[fileidx], "Datatype_Double \n");
                            objrawcnt++;
                        }
                        else{
                            printf("what im gonna do...\n");
                            return 0;
                        }
                        uint32_t Dimensionrawarray; // must be 1
                        fread(&Dimensionrawarray, sizeof Dimensionrawarray, 1, f);
                        printf("Dimensionrawarray: %" PRIu32 "\n", Dimensionrawarray);
                        prevDimensionarray = Dimensionrawarray;

                        uint64_t numrawdata = 0; //rawdata 갯수
                        fread(&numrawdata, sizeof numrawdata, 1, f);
                        printf("numrawdata: %" PRIu32 "\n", numrawdata);

                        printf("pos numrawdata : %" PRIu32 "\n", ftell(f));

                        numraw = numrawdata;

                        rawarr[rawobjcnt] = numrawdata;

                        fprintf(files[fileidx], "%d \n",numraw);

                        prevnumrawdata = numrawdata;
                    }

Я очень ценю твою помощь!

С новым годом!

...