使用C读取TDMS文件的元数据

时间:2019-01-16 10:58:34

标签: c labview

我对NI的.tdms文件读取有疑问。...

我在NI网站上阅读了TDM文件格式的内部结构。我写了一些代码,以便将.TDMS文件转换为.txt文件。

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

我尝试使用十六进制编辑程序,Python代码打开.tdms文件,但得到了其他伟大人物的帮助。

(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]

这就是我的做法。我用了很多'if'...仍然行不通..

我的问题是否有更好的方法来解决?

从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;
                    }

非常感谢您的帮助!

新年快乐!

0 个答案:

没有答案