2012-03-06 8 views
0

私は8バイト長であると考えているタイムスタンプを持っているので、六角でのDateTime

00 00 00 00 DE A4 4F 4F

のように見えるファイルを解析しようとしてるに8バイトヘクスに変換する方法

これをInt64として解析すると、正しい日付/時刻が表示されません。しかし、私は最初の4バイトをスキップして、何かのようにすると、私は正しいdatetimeを取得します。

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#」などのプレフィックスを付けないでください。それがタグのためのものです。 –

答えて

5

あなたは、ファイル内の位置をミスカウントあなたのために、例えば...値が実際に

DE A4 4F 4F 00 00 00 00 

ではありませんか?より多くの意味を作る、そしてあなたがそうのように変換したいリトルエンディアンの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なし)

EDIT:。それは、64ビット整数を作成するために、ビッグエンディアン順に並べ本当に 2リトルエンディアンの32ビット整数、それからならあなたは使用することができます:

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

16進エディタでファイルを見ると00 00 00 00 DE A4 4F 4Fとなります。私はもともとあなたが先に持っているものに似たものを試していましたが、私は範囲外の議論から引数を得ていました。 – poco

+0

@poco:ファイルは実際にわずか8バイトですか?それは非常に奇妙に思えます。ファイルを作成するのは何ですか? –

+0

ファイルは実際かなり長いですが、私はこれらの8バイトの前後に対応するバイトを知っています。最初の4バイトが埋められている可能性はありますが、私は8バイトがDateTimeであると確信しています。それ以来、あなたは編集をしています。私はその数時間前に思いついたはずです。ご協力いただきありがとうございます。 – poco

-1

これを解析する適切な方法は何ですか?

これを「適切に」解析するには、バイナリデータがどのように格納され、どのように正確に表現されているかが必要です。

あなたのケースでは、それはInt32として解析する必要があるようです。すべての場合に適切なパディングを決定する必要があります。ストリーム内のデータの構造を事前に知らなくても、バイナリストリームを「適切に」解析する方法を「知る」方法はありません。別の問題として

、この文:ToInt32がすでに提供しているので、この場合にはLINQを使用して

BitConverter.ToInt32(bytes, index + 4) 

は、単に操作は非常に非効率的になり:

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

がより効率的のように書くことでしたオフセット。

0

データから有効なDateTimeをどのように取得しているかに基づいて、POSIXのtime_t形式によく似ています.1970年1月1日以降の秒数で、64ビットの整数値として格納されます。これらを一度DateTimeに変換する方法に関するいくつかの関連する質問があります。これがあなたを助けている場合を参照してください:

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