2012-03-06 33 views
0

我試圖解析具有時間戳,我認爲是8個字節長,看起來像這樣十六進制如何8個字節十六進制轉換爲DateTime

00 00 00 00 DE A4 4F 4F

文件

當我將其解析爲Int64時,我沒有收到正確的日期/時間。但是,如果我跳過前4個字節,並做了這樣的事情,所以我得到正確的日期時間。

TimeSpan span = TimeSpan.FromTicks(BitConverter.ToInt32(bytes.Skip(index).Take(8).ToArray(),4) * TimeSpan.TicksPerSecond); 
DateTime t = new DateTime(1970, 1, 1).Add(span); 
StartTime = TimeZone.CurrentTimeZone.ToLocalTime(t); 

但是,我不確定接下來要解析的文件將在前4個字節中領先00。如果我把它解析爲一個ToInt64,我會拋出一個outOfRange異常。解析這個的正確方法是什麼?

+0

請不要用「C#」等來標題。這就是標籤的用途。 – 2012-03-06 21:01:12

回答

5

確定的值不實際上

DE A4 4F 4F 00 00 00 00 

...例如,由於您的計數錯誤文件中的位置?

這將使更多的意義,並表示little-endian的64位整數,其中你會像這樣轉換:

static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, 
               DateTimeKind.Utc); 

... 

long seconds = BitConverter.ToInt64(data, index); 
DateTime date = Epoch + TimeSpan.FromSeconds(seconds); 

(注意:這種轉換代碼是如何更簡單的,順便說一句 - 沒有瞎搞與LINQ,並沒有通過TicksPerSecond mulitplying值)

編輯:如果這是真的兩個小尾數32位整數,安排在大端爲了創建一個64位整數,然後你可以使用:

ulong x = BitConverter.ToUInt32(data, index); 
ulong y = BitConverter.ToUInt32(data, index + 4); 
ulong combined = (x << 32) | y; 
long seconds = unchecked ((long) combined); 
+0

在十六進制編輯器中查看文件,它讀取00 00 00 00 DE A4 4F 4F。我最初嘗試了一些類似於你上面的東西,但是我得到了一個超出範圍的異常。 – poco 2012-03-06 23:12:08

+0

@poco:文件真的只有8個字節嗎?這似乎很奇怪。什麼是創建文件? – 2012-03-06 23:12:54

+0

該文件實際上是相當長的先生,但是我知道這8個字節前後的字節對應的內容。前4個字節可能只是填充,但我相當確信8個字節是DateTime。你是編輯總數,因爲我現在正在踢自己,因爲我應該在幾個小時前想出來。非常感謝您的幫助先生。 – poco 2012-03-07 03:17:48

-1

什麼是正確的解析方法?

解析此「正常」需要了解二進制數據的存儲方式以及它的準確表示。

就你而言,它聽起來像它必須被解析爲Int32。你將需要在所有情況下確定適當的填充。沒有辦法「知道」如何在不知道流中數據結構的情況下「正確地」解析二進制流。

作爲一個獨立的問題,這種說法:

BitConverter.ToInt32(bytes.Skip(index).Take(8).ToArray(),4) 

可以更有效地寫着:

BitConverter.ToInt32(bytes, index + 4) 

在這種情況下使用LINQ,只是使操作效率非常低,因爲ToInt32已經提供一個偏移量。

0

根據您如何從數據中獲取有效的DateTime,它看起來非常像POSIX time_t格式:自1970年1月1日以來的秒數,存儲爲64位整數值。有關如何將其中一次轉換爲DateTime的幾個相關問題。看看這可以幫助您:

How to convert a Unix timestamp to DateTime and vice versa?

相關問題