2016-08-17 13 views
0

私はTAI64N形式のファイル番号がhere is a referenceです。私はこのsourceを使用しようとすると、それは私が間違って何をやっているBitConverter.ToInt64TAI64NからDateTime

static void Main (string[] args) { 
    string[] filenames = new string[4]{ 
     "4000000057b23bf30017a4bc", 
     "4000000057b23ef61dedacac", 
     "4000000057b24b1c2bab0614", 
     "4000000057b24ca521a230fc" 
    }; 
    foreach (string filename in filenames) { 
     byte[] hexToBytes = StringToByteArray(filename); 
     long bytesToLong = BitConverter.ToInt64(hexToBytes, 0); 
     Console.WriteLine(bytesToLong); // Negative? 
     DateTime longToDateTime = new DateTime(bytesToLong); 
    } 
} 

public static byte[] StringToByteArray (string hex) { 
    return Enumerable.Range(0, hex.Length) 
     .Where(x => x % 2 == 0) 
     .Select(x => Convert.ToByte(hex.Substring(x, 2), 16)) 
     .ToArray(); 
} 

のアシストと負出てきますか?

答えて

0

あなたのTAI64N値のendiannesとあなたのプロセッサの違いを考えましたか?私はあなたがリトルエンディアンであるx86-64プロセッサを使用していると仮定しますが、TAI64Nの値はビッグエンディアンです。メソッドは、値を変換するためにプロセッサのエンディアンを使用します(see Remarks section)。

私はあなたが、配列内のバイトの順序を逆にしてみてくださいお勧め:

public static byte[] StringToByteArray (string hex) { 
    byte[] arr = Enumerable.Range(0, hex.Length) 
     .Where(x => x % 2 == 0) 
     .Select(x => Convert.ToByte(hex.Substring(x, 2), 16)) 
     .ToArray(); 
    Array.Reverse(arr); 
    return arr; 
} 

、その後long bytesToLong = BitConverter.ToInt64(hexToBytes, 4);

ちなみに、私は気づいたあなたはnew DateTime(long ticks)コンストラクタ(reference)を使用することですが、 ティックの代わりにTAI64N仕様)を指定してください。

関連する問題