Список форумов   Список форумов  

Формат timestamp

Всё о программировании на Labview

Модераторы: Техподдержка NI, Robert, Модератор

Формат timestamp

Сообщение 4EB » Вт фев 28, 2012 2:18 pm

Есть двоичный файл, который содержит поле timestamp и несколько полей single.
Нужно расшифровать его не используя LabView.
Я сумел понять только, что timestamp занимает 16 байт, как их интерпретировать?
4EB
 
Сообщений: 4
Зарегистрирован: Вт фев 28, 2012 2:01 pm

Re: Формат timestamp

Сообщение IvanLis » Вт фев 28, 2012 9:22 pm

4EB писал(а):Есть двоичный файл, который содержит поле timestamp и несколько полей single.
Нужно расшифровать его не используя LabView.
Я сумел понять только, что timestamp занимает 16 байт, как их интерпретировать?


Посмотрите:
Read LabView binary file timestamp into Matlab
Labview timestamp conversion
Знание нескольких принципов освобождает от знания многих фактов!

Живу я здесь ||| LabVIEW Portal in Google+
IvanLis
Специалист LabVIEW
 
Сообщений: 491
Зарегистрирован: Пн апр 23, 2007 1:44 pm
Откуда: СССР

Re: Формат timestamp

Сообщение 4EB » Ср фев 29, 2012 10:49 am

Спасибо, но это не то. Странно, что это составляет какую-то тайну

Вот что похоже на правду:

U64 - Fractional part of seconds since 12:00 am, Friday Jan 1, 1904 UT
U64 - Seconds since 12:00 am, Friday Jan 1, 1904 UT

Вопрос остается открытым
4EB
 
Сообщений: 4
Зарегистрирован: Вт фев 28, 2012 2:01 pm

Re: Формат timestamp

Сообщение 4EB » Ср фев 29, 2012 12:22 pm

Похоже нашел:
http://zone.ni.com/reference/en-XX/help ... ef/ni-btf/

NI-BTF uses a CVITime structure, which is defined as follows:

typedef struct

{

unsigned __int64 lsb; // positive fractions (2-64) of a second

__int64 msb; // number of whole seconds after 12:00 a.m., Friday, January 1, 1904, Universal Time

} CVITime;
4EB
 
Сообщений: 4
Зарегистрирован: Вт фев 28, 2012 2:01 pm

Re: Формат timestamp

Сообщение 4EB » Вт мар 13, 2012 3:47 pm

Код для VBA6

Код: выделить все
Option Explicit
Option Base 0

Private Type SYSTEMTIME
    wYear As Integer
    wMonth As Integer
    wDayOfWeek As Integer
    wDay As Integer
    wHour As Integer
    wMinute As Integer
    wSecond As Integer
    wMilliseconds As Integer
End Type

Private Type TIME_ZONE_INFORMATION
    bias As Long
    StandardName(31) As Integer
    StandardDate As SYSTEMTIME
    StandardBias As Long
    DaylightName(31) As Integer
    DaylightDate As SYSTEMTIME
    DaylightBias As Long
End Type

Private Declare Function GetTimeZoneInformation _
    Lib "kernel32" ( _
    lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long

Public Type Timestamp
    p0 As Currency
    p1 As Currency
End Type

Public Function TimestampToDays(T As Timestamp) As Double
    Const day0 As Double = 1462# '= #1/1/1904# - Нулевая дата
    Const n264 As Double = 1# / 2 ^ 64
    Const dINs As Double = 1# / (24# * 60# * 60#)
    Const dINm As Double = 1# / (24# * 60#)
    Dim sec1 As Double 'Секунды целые
    Dim sec2 As Double 'Секунды дробные
    Dim Days As Double 'Дней
    Dim bias As Double 'Поправка на часовой пояс
    Dim TZI As TIME_ZONE_INFORMATION
    GetTimeZoneInformation TZI
    sec1 = T.p1 * 10000#
    sec2 = T.p0 * 10000# * n264
    If sec2 < 0 Then sec2 = sec2 + 1#
    Days = (sec1 + sec2) * dINs
    bias = -TZI.bias * dINm
    TimestampToDays = day0 + Days + bias
End Function

Public Function TimestampToDate(T As Timestamp) As Date
    TimestampToDate = CDate(TimestampToDays(T))
End Function


'Пример
'        Dim rng As Excel.Range
'        Dim ts As Timestamp
'
'        Open "afile.bin" For Binary As #1
'        Get #1, , ts
'
'        Set rng = ...
'        rng.NumberFormat = "yyyy/mm/dd hh:mm:ss.000000"
'
'        'Так доли секунды будут отброшены
'        rng.Value = TimestampToDate(ts)
'
'        'А так доли секунды будут видны
'        rng.Value = TimestampToDays(ts)
4EB
 
Сообщений: 4
Зарегистрирован: Вт фев 28, 2012 2:01 pm


Вернуться в LabVIEW

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3