Mysql 复杂的未知日期/时间表示法
包含奇怪格式的日期/时间的日志文件让我保持清醒。Mysql 复杂的未知日期/时间表示法,mysql,datetime,reverse-engineering,Mysql,Datetime,Reverse Engineering,包含奇怪格式的日期/时间的日志文件让我保持清醒。 我没有设法对所使用的算法进行反向工程。使用www.digital-detective.co.uk上的DCode也不起作用。 我知道:它是一个64位的值,从1900年1月1日开始。 一些例子: 日期/时间:十六进制表示法: 1900-01-01 00:00:00>000000000000000 2006-07-19 00:00:00>0000000000 A000E3 2008-04-14 00:00:00>00000000000050E3 200
我没有设法对所使用的算法进行反向工程。使用www.digital-detective.co.uk上的DCode也不起作用。 我知道:它是一个64位的值,从1900年1月1日开始。 一些例子: 日期/时间:十六进制表示法:
1900-01-01 00:00:00>000000000000000
2006-07-19 00:00:00>0000000000 A000E3
2008-04-14 00:00:00>00000000000050E3
2008-04-15 11:04:32>00D6CF74C42E50E3
2008-04-15 11:04:46>00CEA0C8C52E50E3
2008-04-15 11:08:32>00EC3B36DB2E50E3
2008-04-16 11:08:43>008B3B41DC4E50E3
2008-04-16 11:21:02>00B3AD52224F50E3
2012-02-21 00:00:00>00000000000000E4
2012-03-13 13:37:54>007A35F12CB202E4
2012-10-22 16:27:13>001F7A2AF0951EE4
知道如何将给定值转换为日期/时间以恢复睡眠吗?我可以肯定地告诉您,该值要么需要交换endianness,要么需要反转。您可以看到除以
E3
和E4
结尾的历元之外的所有日期,其中大多数其他数字变化一吨。您还可以看到00:00:00的时间在左侧有平坦的零,这进一步验证了这一说法
不过,我做了一些快速的计算,它似乎不是以秒、纳秒、微秒或其他任何形式表示的。不过,这些值之间肯定存在线性相关性。从这里我要做的是生成一批相隔几秒钟的时间,并查看值是如何变化的。这将有助于确认是否需要反转数字或翻转尾数,还可能提示值与秒的关系
编辑:这绝对是一个尾端翻转,而不是字符串反转。如果这是一个反转,它会变成E3
->F3
,而不是E3
->E4
。doh
从这里,我将在纪元之后生成100秒、1000秒和10000秒的时间。这可能会给你一个额外的提示。基于尼克·卡诺的答案,似乎十六进制对需要 从右向左读。您可以通过以下方式将十六进制值转换为日期: 以下步骤:
Int
Timestamp=A*Int+B
,其中A=2.45563569478691e-09
和B=-39014179200.000061
时间戳
(自1970-01-01纪元起的秒数)转换为日期
Datetime Hex RHex Flip \
0 1900-01-01 00:00:00 0000000000000000 0000000000000000 0000000000000000
1 2006-07-19 00:00:00 0000000000A000E3 3E000A0000000000 E300A00000000000
2 2008-04-14 00:00:00 00000000000050E3 3E05000000000000 E350000000000000
3 2008-04-15 11:04:32 00D6CF74C42E50E3 3E05E24C47FC6D00 E3502EC474CFD600
4 2008-04-15 11:04:46 00CEA0C8C52E50E3 3E05E25C8C0AEC00 E3502EC5C8A0CE00
5 2008-04-15 11:08:32 00EC3B36DB2E50E3 3E05E2BD63B3CE00 E3502EDB363BEC00
6 2008-04-16 11:08:43 008B3B41DC4E50E3 3E05E4CD14B3B800 E3504EDC413B8B00
7 2008-04-16 11:21:02 00B3AD52224F50E3 3E05F42225DA3B00 E3504F2252ADB300
8 2012-02-21 00:00:00 00000000000000E4 4E00000000000000 E400000000000000
9 2012-03-13 13:37:54 007A35F12CB202E4 4E202BC21F53A700 E402B22CF1357A00
10 2012-10-22 16:27:13 001F7A2AF0951EE4 4EE1590FA2A7F100 E41E95F02A7A1F00
Int Timestamp Date
0 0 -39014179200 0733-09-10 00:00:00
1 16357249768470085632 1153267200 2006-07-19 00:00:00
2 16379591844746493952 1208131200 2008-04-14 00:00:00
3 16379643266054739456 1208257472 2008-04-15 11:04:32
4 16379643271755910656 1208257486 2008-04-15 11:04:46
5 16379643363789106176 1208257712 2008-04-15 11:08:32
6 16379678552640686848 1208344123 2008-04-16 11:08:43
7 16379678853581091584 1208344862 2008-04-16 11:21:02
8 16429131440647569408 1329782400 2012-02-21 00:00:00
9 16429890296696109568 1331645874 2012-03-13 13:37:54
10 16437740548686225152 1350923233 2012-10-22 16:27:13
请注意,计算的(最后一个)Date
列与给定的(第一个)Datetime
列,1900-01-01 00:00:00除外。我猜是MySQL插入的
1900-01-01 00:00:00
作为无效日期的默认值
通过对数据进行线性回归,找到神奇常数A和B。给定日期时间
s,可以计算相应的时间戳
。然后,通过对时间戳
s与Int
s拟合最佳拟合行,可以找到A和B
下面是我用来探索问题并生成上表的python代码:
import pandas as pd
import numpy as np
import struct
import binascii
df = pd.read_table('data', sep='\s{2,}', parse_dates=[0])
df['RHex'] = df['Hex'].str[::-1]
def flip_endian(x):
xbytes = binascii.unhexlify(x)
swapped = struct.pack('<8h', *struct.unpack('>8h', x))
return swapped
df['Flip'] = df['RHex'].apply(flip_endian)
df['Int'] = df['Flip'].apply(lambda x: int(x, 16))
# The constants were found by linear regression:
# import scipy.stats as stats
# df['Timestamp'] = (df['Datetime'] - pd.Timestamp('1970-1-1')).dt.total_seconds()
# A, B, rval, pval, stderr = stats.linregress(df['Int'], df['Timestamp'])
A, B = 2.45563569478691e-09, -39014179200.000061
df['Timestamp'] = (A*df['Int'] + B).astype(int)
df['Date'] = (np.array(['1970-01-01'], dtype='datetime64[D]')
+ np.array(df['Timestamp'], dtype='timedelta64[s]')).tolist()
print(df)
将熊猫作为pd导入
将numpy作为np导入
导入结构
导入binascii
df=pd.read_table('data',sep='\s{2,}',parse_dates=[0])
df['RHex']=df['Hex'].str[:-1]
def flip_endian(x):
xbytes=binascii.unexlify(x)
交换=结构包('8h',x))
返回交换
df['Flip']=df['RHex']。应用(Flip_endian)
df['Int']=df['Flip'].apply(lambda x:Int(x,16))
#通过线性回归找到常数:
#将scipy.stats导入为stats
#df['Timestamp']=(df['Datetime']-pd.Timestamp('1970-1-1')).dt.total_seconds()
#A,B,rval,pval,stderr=stats.linregresse(df['Int'],df['Timestamp'])
A、 B=2.45563569478691e-09,-39014179200.000061
df['Timestamp']=(A*df['Int']+B).astype(Int)
df['Date']=(np.array(['1970-01-01'],dtype='datetime64[D]'))
+数组(df['Timestamp'],dtype='timedelta64[s]')。tolist()
打印(df)
当00000000000050E3<0000000000 A000e3时,你怎么说存在“线性”相关性?我尝试使用位置方法解码,而不是将它们视为数字。我上面的比较实际上是通过去掉Endian来表示“00000000000050”<“0000000000 A000”。但是他们提到的日期分别是2008年和2006年。我第一次给你的答复是不正确的,你在我的理论的一部分上施加了干扰,但不是完全的。顺便说一句,我想你不知道endianness是什么。交换这两个数字的尾端可以得到e300a0000000000
和e3500000000000
。你基本上是在两位数对上反转。这是一个有趣的谜语,但我无法解开它(除了基本的反向阅读)。我建议你继续问。让我们了解解决方案的最新情况(当然,在你睡个好觉之后!)。事实上,endianness就是答案,使用它,最正确的字节被分成了两个部分。该乘法器是通过以下方式隔离的:set@a=conv(LEFT(HEX(substring(@RuweString,8,1)),1),16,10,其中RuweString是来自数据源的8字节字。