gpt4 book ai didi

c# - PHP:将 C# 64 位时间戳转换为 Unix 时间戳

转载 作者:太空宇宙 更新时间:2023-11-03 16:31:51 24 4
gpt4 key购买 nike

我正在将 C# 函数复制到 PHP。在 C# 中,GUID、DateTime 和 bool 值被转换为字节。接下来,字节数组被合并和编码。最后一步是将其转换为 base64。

字节数组存在以下部分:

GUID: 16 bytes
Timestamp: 8 bytes
Boolean: 1 byte

在 php 中,我已经转换了 base64 并将字符串解码回字节。我还设法将前 16 个字节转换为 GUID。我验证了 PHP 返回给我的字节,它们是正确的。

现在我将 8 个字节转换为 PHP 中的时间戳。到目前为止,我没有运气。我想问题在于它返回一个 int64。

C#

这是要转换为日期时间的 C# 字节数组:

public DateTime Timestamp;
......
byte[] timestamp_bytes = new byte[8];
input.Read(timestamp_bytes, 0, 8);
Timestamp = DateTime.FromBinary(System.BitConverter.ToInt64(timestamp_bytes, 0));

这是 C# 日期时间到字节数组的转换:

public DateTime Timestamp;
......
byte[] timestamp_bytes = System.BitConverter.GetBytes(Timestamp.ToBinary());

当我输出 Timestamp.ToString() 时,在这两种情况下我都会得到 23-12-2011 09:54:56

PHP

在 PHP 中我设法得到了 8 个字节的十六进制:

$bin = pack("C*", 119, 23, 124, 173, 103, 143, 206, 136);
$hex = unpack("H*", $bin);

接下来我该做什么?我已经尝试了一些转换方法,但我似乎从来没有得到正确的答案。

附加信息:

这8个字节分别是:119、23、124、173、103、143、206、136

十六进制字符串是:77177cad678fce88

我应该得到的日期时间:23-12-2011 09:54:56

php -r 'echo PHP_INT_MAX;'返回 9223372036854775807

C# 应用不在我的权限下,所以我不能保证我可以更改它

最佳答案

我们来看看DateTime.ToBinary MethodDateTime.Ticks Property文档。

首先,DateTime 的二进制形式表示两个 属性(Kind 和 Ticks),并且不清楚它们在二进制字符串中是如何连接的。然后,Ticks 属性是自耶稣基督诞生以来经过的百万分之一秒

那么,如何进行呢?

  1. 尝试理解 KindTicks 属性是如何二进制存储的。我们需要Ticks。我的建议是尝试将一些典型的 DateTime 值转换为二进制并分析输出。从 DateTime.MinValue 开始,它应该对应于 01-01-0001 00:00:00。您应该看到(我认为)所有零,除了 Kind 值(如果存在)。

  2. 获得 64 位 Ticks 值后,您可以使用 floor($ticks/10000000) 获取秒数。最后,您必须减去从 1 年到 1970 年(Unix 标准)经过的秒数,这是一个常量,您可以转换 C# DateTime 01-01-1970 00:00:00 到二进制...

祝你好运。

关于c# - PHP:将 C# 64 位时间戳转换为 Unix 时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10596582/

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