C# 6字节时间戳到日期时间

C# 6字节时间戳到日期时间,c#,datetime,C#,Datetime,我使用第三方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.ToUInt3

我使用第三方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/1970 12:00:00 AM},但预计是2012年。

我假设时间戳使用小端格式。我还遗漏了参数验证

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);
我假设时间戳使用小端格式。我还遗漏了参数验证

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);
结果是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);
对于在big-endian机器上运行:

if (!BitConverter.IsLittleEndian)
{
    newStamp = newStamp.Reverse().ToArray();
}
结果是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);
对于在big-endian机器上运行:

if (!BitConverter.IsLittleEndian)
{
    newStamp = newStamp.Reverse().ToArray();
}


有一种叫做比特转换器的东西。ToInt64@atornblad1您需要填充阵列。2 BitConverter.ToInt64使用本机endianness。我假设他收到的数据是little endian。有一种东西叫做位转换器。ToInt64@atornblad1您需要填充阵列。2 BitConverter.ToInt64使用本机endianness。我假设他收到的数据是little endian。时间戳使用little endian还是本机endian?所有数据都使用little endian字节顺序。预期结果真的是2012吗?我得到了2011年11月14日10:49:16您正在使用BitConverter.ToUInt32,这肯定不会有帮助…这将只查看字节[0…3],即32位显示此API是否处理纪元开始之前的日期?它是否将最后一个字节的MSB作为符号位进行线程化?或者它只是不支持这样的日期?时间戳使用小尾端还是本机尾端?所有数据都使用小尾端字节排序。预期结果真的是2012吗?我得到了2011年11月14日10:49:16您正在使用BitConverter.ToUInt32,这肯定不会有帮助…这将只查看字节[0…3],即32位显示此API是否处理纪元开始之前的日期?它是否将最后一个字节的MSB作为符号位进行线程化?或者它只是不支持这样的日期?不适合更新的问题。您还应该包括添加填充的代码。现在,您的代码在big-endian系统上根本不起作用,因为您的解析采用本机endian,而填充采用Litt-endian。是的,这正是您使用BitConverter.ToUInt64时出现故障的原因,因为它假定了本机端性。如果在big-endian机器上运行,您可以反转输入数据。请参阅我的编辑。但是我认为OP可以手动完成这样的事情这不是很C语言,但是你可以做Array.Resizeref timestamp,8来填充原始字节数组。不适合更新的问题。您还应该包括添加填充的代码。现在,您的代码在big-endian系统上根本不起作用,因为您的解析采用本机endian,而填充采用Litt-endian。是的,这正是您使用BitConverter.ToUInt64时出现故障的原因,因为它假定了本机端性。如果在big-endian机器上运行,您可以反转输入数据。请参阅我的编辑。但是我认为OP可以手动完成这样的事情这不是很C语言,但是你可以做Array.Resizeref timestamp,8来填充原始字节数组。