У меня есть вопрос о чтении файла 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;
}
Я очень ценю твою помощь!
С новым годом!