У меня странная проблема с сериализацией объектов.
в документации к файлу указано следующее:
Ввод начинается с 4-байтового тега.
который идентифицирует сегмент TDMS
( "TDSm"). Следующие четыре байта используются
в качестве битовой маски, чтобы указать
какие данные сегмента
содержит. Эта битовая маска называется
как ToC (Оглавление). любой
комбинация следующих флагов может
быть закодирован в ToC: следующие четыре
байты содержат номер версии (32-битный
целое число без знака), которое указывает
самая старая TDMS ревизия сегмента
в соответствии. Во время этого
написание, номер версии 4713.
Единственная предыдущая версия TDMS имеет
номер 4712. Следующие восемь байтов
(64-разрядное целое число без знака)
длина оставшегося сегмента
(общая длина сегмента минус
длина поводка в). Если дальше
сегменты добавляются в файл,
этот номер может быть использован для поиска
отправная точка следующего
сегмент. Если приложение встретилось
серьезная проблема при записи в
Файл TDMS (сбой, отключение электроэнергии), все
байты этого целого числа могут быть 0xFF.
Это может произойти только до последнего
сегмент в файле. Последние восемь
байты (64-разрядное целое число без знака)
опишите общую длину
метаинформация в сегменте. это
информация используется для произвольного доступа
к необработанным данным. Если сегмент
не содержит метаданных вообще
(свойства, индексная информация, объект
список), это значение будет 0.
так что я реализован как
class TDMsLEADIN {
public:
char Signature[4]; //TDSm
__int32 Toc;
unsigned __int32 vernum;
unsigned __int64 nextSegmentOff;
unsigned __int64 rawDataOff;
};
fread(&leadin,sizeof(TDMsLEADIN),1,f);
тогда я получил подпись = "TDsm", TOc = 6, vernum = 4712, как и ожидалось.
nextSegmentOff = 833223655424, rawDataOff = 8589934592, но ожидается как nextSegmentOff, так и rawDataOff = 194
затем я делю класс на две части и читаю две две части отдельно
class TDMsLEADIN {
public:
char Signature[4]; //TDSm
__int32 Toc;
unsigned __int32 vernum;
};
class TDMsLeadINend{
public:
unsigned __int64 nextSegmentOff;
unsigned __int64 rawDataOff;
};
fread(&leadin,sizeof(TDMsLEADIN),1,f);
fread(&leadin2,sizeof(TDMsLeadINend),1,f);
тогда я получил nextSegmentOff, rawDataOff, как и ожидалось = 194.
мой вопрос, что не так с оригинальным кодом? почему это работает, когда я разбить его на две части? я попытался unsigned long long вместо unsigned __int64, но все же результат тот же.
это довольно странно.
Спасибо