首页
社区
课程
招聘
[求助]十六进制日期的表示方法
发表于: 2017-5-17 16:33 6329

[求助]十六进制日期的表示方法

2017-5-17 16:33
6329
十六进制的B1 22 或者是22 B1是如何表示2017-05-17这个日期的?求大神指定下算法


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 222
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2

你的这个日期是DOS时间的一个变种,从2000开始计算时间,DOS时间本来是1980开始计算的。

int todos(int y, int m, int d) {
    y -= 2000;
    return y << 9 | m << 5 | d;
}

printf('%x', todos(2017, 5, 17)); 22 b1

我把代码改了以下,从2000开始,这样得到的结果就是正确的。

下面是PHP的实现

/**
 * Unix timestamp to DOS datetime(4 bytes)
 * https://msdn.microsoft.com/en-us/library/ms724247.aspx
 * 
 * @param  integer $timestamp Unix timestamp
 * @return integer            DOS datetime for 4 bytes
 */
function timestamp2dos($timestamp)
{
	$bit = empty($timestamp) ? getdate() : getdate($timestamp);
	if ($bit['year'] < 2000)
		return (1 << 21 | 1 << 16);
	$bit['year'] -= 2000;
	return $bit['year'] << 25 |
		$bit['mon'] << 21 |
		$bit['mday'] << 16 |
		$bit['hours'] << 11 |
		$bit['minutes'] << 5 |
		$bit['seconds'] >> 1;
}

echo dechex(timestamp2dos(mktime(0, 0, 0, 5, 17, 2017)))
//22 b1 00 00

上面的例子是传入的unix timestamp,但是最终还是用 year、mon、day之类的计算的,照葫芦画瓢即可:https://msdn.microsoft.com/en-us/library/ms724247.aspx

2017-5-17 20:05
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
geoh 你的这个日期是DOS时间的一个变种,从2000开始计算时间,DOS时间本来是1980开始计算的。int&nbsp;todos(int&nbsp;y,&nbsp;int& ...
十分感谢!
2017-5-18 08:09
0
游客
登录 | 注册 方可回帖
返回
//