十六进制时间戳解码

逆向工程 十六进制 串行通讯
2021-06-30 08:29:14

我正在尝试解码这个十六进制时间戳:

5A24 B103 73AE --> 02/26/2018 15:45:44 
5A24 FC03 83BC --> 02/26/2018 17:00:48
5A24 FE03 93E3 --> 02/26/2018 17:02:58

数据来自旧的控制器串行协议。专有软件显示“十六进制控制器时间”并将其转换为显示的值。

你如何解决这个问题?

1个回答
import sys
import os

if(len(sys.argv) != 2):     
    sys.exit("usage %s 0xdead" % os.path.basename(sys.argv[0]))

if((sys.argv[1].startswith("0x")!=True) or (len(sys.argv[1])!=6 )):
    sys.exit("0x prefixed hexinput must be in range 0x0000 to 0xffff padded to 4 digits")

indate = int(sys.argv[1],16)

year   =  str(((indate & 0xfe00) >> 9) + 2000)
month  =  str((indate & 0x01e0) >> 5)
day    =  str((indate & 0x001f) >> 0)
sep    =  "/"

print "The date is in MSDOS DATE FORMAT"
print "y2k-fixed year9to15 bits month 5t08bits and day 0to5 bits"
print (day+sep+month+sep+year)

0x245a 作为输入

:\>python msdosdate.py 0x245a
The date is in MSDOS DATE FORMAT
y2k-fixed year9to15 bits month 5t08bits and day 0to5 bits
26/2/2018

编辑了一个包含所有三个短整数的完整脚本

:>cat makedatetime.py
import sys
if(len(sys.argv) != 4):
    sys.exit("usage python thisscript.py 1337 dead d00d")
for i in range(1,4,1):
    if(len(sys.argv[i]) != 4):
        sys.exit("enter unsigned short integer of type 'H' in hex \n"
                "like dead d00d 1337 babe etc duly padded to 4 digits")
indate      = int(sys.argv[1],16)
inminute    = int(sys.argv[2],16)
inseconds   = int(sys.argv[3],16)
year        = str(((indate &0xfe00) >> 9)+2000)
month       = str(((indate &0x01e0) >> 5)+0000)
day         = str(((indate &0x001f) >> 0)+0000)
hours       = str(inminute/60)
minutes     = str(inminute%60)
seconds     = str(inseconds/1000)
millisecs   = str(inseconds%1000)


print(month+"/"+day+"/"+year+" "+hours+":"+minutes+":"+seconds+":"+millisecs)
:>python makedatetime.py 245A 03B1 AE73
2/26/2018 15:45:44:659

:>python makedatetime.py 245A 03FC BC83
2/26/2018 17:0:48:259

:>python makedatetime.py 245A 03FE E393
2/26/2018 17:2:58:259