gpt4 book ai didi

c++ - 将字节数组转换为 time_t

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:22 27 4
gpt4 key购买 nike

我有一个 linux 时钟,它向我发送带字节的时钟,我不知道如何从中获取时钟,我知道它是一种“time_t”类型(可能是自从1/1/1970), 请看下面的几个例子,我从时钟收到了什么(我不确定它发送的是本地时间还是 GMT 时间)

此字节表示 11/09/2017 16:52(本地时间)或 11/09/2017 21:52(格林威治标准时间)

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,66,120,53,34,0,0,0

此字节表示 11/10/2017 10:27(本地时间)或 11/10/2017 15:27(格林威治标准时间)

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,162,111,54,34,0,0,0

这个字节表示 11/13/2017 14:20(Local time) 或 11/13/2017 19:20(GMT)

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,160,154,58,34,0,0,0

最佳答案

通过一些逆向工程,可以查看来自 Linux 时钟的数据在做什么。

如果您阅读数据行,您会发现最后 7 个字节是递增计数器,最低有效字节位于第一个位置。如果您计算一下,3 个计数器的总数如下:

573929538
573992866
574266016

查看第一个数字与第二个和第三个数字的差异,您得到以下信息:

63328
336478

...这是您的样本之间耗时,以秒为单位。

出于某种原因,原始值不是自 Unix 纪元以来的秒数,而是自 1999 年 9 月的一天以来的秒数。

无论如何,以下源代码显示了如何将数据转换为本地时间的基础知识。

#include <time.h>

int main(int argc, char* argv[])
{
const unsigned long localEpoch = 936316800; // local epoch Sept 1999

std::vector<std::vector<int>> timeData =
{
{ 66, 120, 53, 34, 0, 0, 0 },
{ 162, 111, 54, 34, 0, 0, 0 },
{ 160, 154, 58, 34, 0, 0, 0 }
};

for (auto& data : timeData)
{
// convert to total seconds
unsigned long total = 0;
for (std::vector<int>::iterator it = data.begin(); it != data.end(); ++it)
{
total += (*it) << (std::distance(data.begin(), it) * 8);
}
std::cout << "Seconds: " << total << std::endl;

// add to local epoch and display
time_t raw = total + localEpoch;
struct tm timeinfo;
localtime_s(&timeinfo, &raw);

char fmt[100] = { 0 };
asctime_s(fmt, 100, &timeinfo);
std::cout << fmt << std::endl;
}

return 0;
}

它给出了以下输出:

Seconds: 573929538
Thu Nov 9 16:52:18 2017

Seconds: 573992866
Fri Nov 10 10:27:46 2017

Seconds: 574266016
Mon Nov 13 14:20:16 2017

希望对您有所帮助。 (注意我是在 VS 中完成的,所以时间格式化功能是 Windows 的变体,但你明白了。)

(编辑):按要求确定,这里有一些等效的 C# 代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
class Program
{
public static void Main(string[] args)
{
int[,] timeData = new int[,]
{
{ 66, 120, 53, 34, 0, 0, 0 },
{ 162, 111, 54, 34, 0, 0, 0 },
{ 160, 154, 58, 34, 0, 0, 0 }
};

for (int line = 0; line < timeData.GetLength(0); ++line)
{
ulong total = 0;
for (int i = 0; i < timeData.GetLength(1); ++i)
{
total += (ulong)timeData[line,i] << (8 * i);
}
System.Console.WriteLine("Seconds: " + total.ToString());
DateTime result = FromUnixTime(total + localEpoch);
System.Console.WriteLine(result.ToString());
}

System.Console.ReadKey();
}

public static DateTime FromUnixTime(ulong unixTime)
{
return epoch.AddSeconds(unixTime);
}

private static readonly DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

private static readonly ulong localEpoch = 936316800; // local epoch Sept 1999
}
}

(感谢 this question 进行 Epoch 转换。)

关于c++ - 将字节数组转换为 time_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47290497/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com