Database 解码旧数据库aka中的日期存储;“乐趣”;有数字

Database 解码旧数据库aka中的日期存储;“乐趣”;有数字,database,binary,reverse-engineering,Database,Binary,Reverse Engineering,我正在编写一个实用程序来从遗留数据库(我们无法查询)中删除记录,而我在解释日期字段的存储方式时遇到了困难 所有日期将采用MM/DD/YYYY格式。十六进制将是由空格分隔的字节(2位) 我们知道: 小时和分钟存储在不同的位置。增加一小时或分钟 日期时间不影响所讨论的4个字节 与月、日和年对应的字段为4字节: 1800年1月1日==70 8E 00 1800年1月15日==7E 8E 00 1800年1月16日==7F 8E 00 1800年1月31日==8E 8E 00 1800年1月2日==8

我正在编写一个实用程序来从遗留数据库(我们无法查询)中删除记录,而我在解释日期字段的存储方式时遇到了困难

所有日期将采用MM/DD/YYYY格式。十六进制将是由空格分隔的字节(2位)

我们知道:

  • 小时和分钟存储在不同的位置。增加一小时或分钟 日期时间不影响所讨论的4个字节
  • 与月、日和年对应的字段为4字节:
    • 1800年1月1日==70 8E 00
    • 1800年1月15日==7E 8E 00
    • 1800年1月16日==7F 8E 00
    • 1800年1月31日==8E 8E 00
    • 1800年1月2日==8F 8E 00
    • 1800年2月2日==90 8E 00
    • 1800年2月15日==9D 8E 00
    • 1800年2月16日==9E 8E 00
    • 1800年2月28日==AA 8E 00
    • 1800年2月29日==AB 8E 00#闰年的占位符
    • 1800年1月3日==AC 8E 00
    • 1800年1月12日==BF 8F 00
    • 1800年2月12日==C0 8F 00
    • 1800年3月12日==C1 8F 00
    • 1800年12月15日==CD 8F 00
    • 1800年12月16日==CE 8F 00
    • 1800年12月30日==DC 8F 00
    • 1800年12月31日==DD 8F 00
    • 1801年1月1日=DE 8F 00
    • 1801年12月31日==4A 91 00

  • 有人有什么想法吗?是的,我熟悉大纪元

    有4个字节。每一新的一天都会增加最左边的字节。一旦该字节到达“FF”,它将向其右侧的字节添加1。试试这个。。(用红宝石写)

     def parse_date(hex)
       actual_known_date = "1/1/2050".to_date
       known_date = "21F30100"
       total_days_since_known_date = 0
    
       first_byte = hex[0,2]
       second_byte = hex[2,2]
       third_byte = hex[4,2]
       fourth_byte = hex[6,2]
    
       known_first_byte = known_date[0,2]
       known_second_byte = known_date[2,2]
       known_third_byte = known_date[4,2]
       known_fourth_byte = known_date[6,2]
    
       byte_4_days = known_fourth_byte.hex - fourth_byte.hex
       byte_3_days = 0
       byte_2_days = 0
       byte_1_days = 0
    
       if known_third_byte.hex >= third_byte.hex
         byte_3_days = known_third_byte.hex - third_byte.hex
       else
         byte_4_days -= 1
         ktb = known_third_byte.hex + 256
         byte_3_days = ktb - third_byte.hex
       end
    
       if known_second_byte.hex >= second_byte.hex
         byte_2_days = known_second_byte.hex - second_byte.hex
       else
         byte_3_days -= 1
         ktb = known_second_byte.hex + 256
         byte_2_days = ktb - second_byte.hex
       end
    
       if known_first_byte.hex >= first_byte.hex
         byte_1_days = known_first_byte.hex - first_byte.hex
       else
         byte_2_days -= 1
         ktb = known_first_byte.hex + 256
         byte_1_days = ktb - first_byte.hex
       end
    
       total_days_since_known_date = (byte_1_days + (byte_2_days * 256) + (byte_3_days * (256 * 256)) + (byte_4_days * (256 * 256 * 256)))
    
       number_of_leap_days = 0
       date_we_want = actual_known_date - (total_days_since_known_date).days
       return date_we_want
     end