C# 6字节时间戳到日期时间
我使用第三方API。根据其规格,如下所示: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
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来填充原始字节数组。