1

サードパーティのAPIを使用しています。その仕様によると、次の

  byte[] timestamp = new byte[] {185, 253, 177, 161, 51, 1}

メッセージが送信用に生成された1970年1月1日からのミリ秒数を表します

問題は、それをDateTimeに変換する方法がわからないことです。

私はもう試した

DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
long milliseconds = BitConverter.ToUInt32(timestamp, 0);
var result =  Epoch + TimeSpan.FromMilliseconds(milliseconds);

結果は{2/1/197012:00:00AM}ですが、2012年が予想されます。

4

2 に答える 2

4
        byte[] timestamp = new byte[] { 185, 253, 177, 161, 51, 1, 0, 0, };
        DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
        ulong milliseconds = BitConverter.ToUInt64(timestamp, 0);
        var result = Epoch + TimeSpan.FromMilliseconds(milliseconds);

結果は2011年11月14日です

CodeInChaos専用のパディングコードを追加します。

    byte[] oldStamp = new byte[] { 185, 253, 177, 161, 51, 1 };
    byte[] newStamp = new byte[sizeof(UInt64)];
    Array.Copy(oldStamp, newStamp, oldStamp.Length);

ビッグエンディアンマシンで実行する場合:

if (!BitConverter.IsLittleEndian)
{
    newStamp = newStamp.Reverse().ToArray();
}
于 2012-04-11T14:16:20.113 に答える
3

timestampリトルエンディアン形式を使用していると思います。また、パラメーターの検証も省略しました。

long GetLongLE(byte[] buffer,int startIndex,int count)
{
  long result=0;
  long multiplier=1;
  for(int i=0;i<count;i++)
  {
    result += buffer[startIndex+i]*multiplier;
    multiplier *= 256;
  }
  return result;
}

long milliseconds = GetLongLE(timestamp, 0, 6);
于 2012-04-11T14:13:08.433 に答える