Hannesh
Hannesh

Reputation: 7488

Unknown time and date format

I'm using code that someone else wrote to load a file format that I can't find any docs or specs for. The file format is *.vpd which is the output of varioport readers used for EKG's.

It reads out 4 bytes for the time and 4 bytes for the date and are each stored in a 4 element array. In a test file I have, the 4 time bytes are { 19, 38, 3, 0 } and the 4 date bytes are { 38, 9, 8, 0 }. It could also be a 32-bit int, and the guy who wrote this is reading it wrong. Judging by the trailing 0 on both, I would assume little endian in which case the values of time and date as int32's are 206355 and 526630 respectively.

Do you know of any time/date formats that are expressed in 4 bytes (or a single int)? I'm hopelessly lost at the moment.

EDIT: I should add that I don't know what the values could be, apart from that the date is likely to be within the last few years.

The code, there are no comments associated with it.

s.Rstime        = fread(fid, 4, 'uint8'); 
s.Rsdate        = fread(fid, 4, 'uint8');

Upvotes: 0

Views: 438

Answers (2)

Piechulla
Piechulla

Reputation: 26

In the Varioport VPD file format, BCD (binary coded decimal) code is used for date and time. You had no chance to guess this, because the fread calls you posted are obviously nonsense. You are reading at the wrong places.

Try this in C/C++ (matlab code will look very similar):

typedef struct
{
    int channelCount;
    int scanRate;
    unsigned char measureDate[3];
    unsigned char measureTime[3];
    ...
} 
VPD_FILEINFO;

...

unsigned char threeBytes[3];
size_t itemsRead = 0;

errno_t err = _tfopen_s(&fp, filename, _T("r+b")); 
// n.b.: vpd files have big-endian byte order!

if (err != 0)
{
    _tprintf(_T("Cannot open file %s\n"), filename);
    return false;
}

// read date of measurement
fseek(fp, 16, SEEK_SET);
itemsRead = fread(&threeBytes, 1, 3, fp);

if (itemsRead != 3)
{
    _tprintf(_T("Error trying to read measureDate\n"));
    return false;
}
else
{
    info.measureDate[0] = threeBytes[0]; // day, binary coded decimal
    info.measureDate[1] = threeBytes[1]; // month, binary coded decimal
    info.measureDate[2] = threeBytes[2]; // year, binary coded decimal
}

// read time of measurement
fseek(fp, 12, SEEK_SET);
itemsRead = fread(&threeBytes, 1, 3, fp);

if (itemsRead != 3)
{
    _tprintf(_T("Error trying to read measureTime\n"));
    return false;
}
else
{
    info.measureTime[0] = threeBytes[0]; // hours, binary coded decimal
    info.measureTime[1] = threeBytes[1]; // minutes, binary coded decimal
    info.measureTime[2] = threeBytes[2]; // seconds, binary coded decimal
}

...

_tprintf(_T("Measure date == %x %x %x\n"), 
         info.measureDate[0], 
         info.measureDate[1], 
         info.measureDate[2]);

_tprintf(_T("Measure time == %x %x %x\n"), 
         info.measureTime[0], 
         info.measureTime[1], 
         info.measureTime[2]);

Upvotes: 1

Hannesh
Hannesh

Reputation: 7488

It's not important anymore, I doubt anyone would be able to answer it anyway.

Upvotes: 0

Related Questions