Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 复杂的未知日期/时间表示法_Mysql_Datetime_Reverse Engineering - Fatal编程技术网

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秒的时间。这可能会给你一个额外的提示。

基于尼克·卡诺的答案,似乎十六进制对需要 从右向左读。您可以通过以下方式将十六进制值转换为日期: 以下步骤:

  • 反转十六进制值
  • 将十六进制值转换为字节
  • 字节交换:将字节解压缩为big-endian,然后重新打包为little-endian
  • 将十六进制值转换为整数,
    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字节字。