3

感谢 ndkrempel,十六进制的日期部分已被破译。时间还有待解码。但是,通过 ndkrempel 在该主题上的工作,我意识到整个时间戳包括额外的 7 个字节,我之前忽略了这些字节,因为我的文件通常包含零分钟或秒的时间戳。以下是一些“完整”的十六进制序列,希望包含准确转换所需的剩余时间数据:

C00AE440555555555555D53F555555555555D53FABAAAAAAAAAAEA3F0CF712000000 = 17.05.1208.00.001024
C00AE440ABAAAAAAAAAAE23F555555555555D53FABAAAAAAAAAAEA3F0CF71200E0C4 = 17.05.1214.00.001024
C00AE440610BB6600BB6E23F555555555555D53FABAAAAAAAAAAEA3F0CF7120058C5 = 17.05.1214.02.001024
C00AE440176CC1166CC1E23F555555555555D53FABAAAAAAAAAAEA3F0CF71200D0C5 = 17.05.1214.04.001024
C00AE440CDCCCCCCCCCCE23F555555555555D53FABAAAAAAAAAAEA3F0CF7120048C6 = 17.05.1214.06.001024

不同时间的附加十六进制代码

C00AE440721CC7711CC7E93F555555555555D53FABAAAAAAAAAAEA3F0CF71200E00F01 = 17.05.1219.20.001024
C00AE440CDCCCCCCCCCCE93F555555555555D53FABAAAAAAAAAAEA3F0CF712001C1001 = 17.05.1219.21.001024
C00AE440287DD2277DD2E93F555555555555D53FABAAAAAAAAAAEA3F0CF71200581001 = 17.05.1219.22.001024
C00AE440DEDDDDDDDDDDE93F555555555555D53FABAAAAAAAAAAEA3F0CF71200D01001 = 17.05.1219.24.001024
C00AE440398EE3388EE3E93F555555555555D53FABAAAAAAAAAAEA3F0CF712000C1101 = 17.05.1219.25.001024
C00AE440943EE9933EE9E93F555555555555D53FABAAAAAAAAAAEA3F0CF71200481101 = 17.05.1219.26.001024
C00AE440EFEEEEEEEEEEE93F555555555555D53FABAAAAAAAAAAEA3F0CF71200841101 = 17.05.1219.27.001024
C00AE4404A9FF4499FF4E93F555555555555D53FABAAAAAAAAAAEA3F0CF71200C01101 = 17.05.1219.28.001024
C00AE440A54FFAA44FFAE93F555555555555D53FABAAAAAAAAAAEA3F0CF71200FC1101 = 17.05.1219.29.001024
C00AE440000000000000EA3F555555555555D53FABAAAAAAAAAAEA3F0CF71200381201 = 17.05.1219.30.001024


E00AE4404A9FF4499FF4EA3F555555555555D53FABAAAAAAAAAAEA3F0CF712004C1C01 = 18.05.1220.13.001024
E00AE440D8822DD8822DEB3F555555555555D53FABAAAAAAAAAAEA3F0CF71200A41E01 = 18.05.1220.23.001024
E00AE440666666666666EB3F555555555555D53FABAAAAAAAAAAEA3F0CF71200FC2001 = 18.05.1220.33.001024
E00AE440F5499FF4499FEB3F555555555555D53FABAAAAAAAAAAEA3F0CF71200542301 = 18.05.1220.43.001024
E00AE440832DD8822DD8EB3F555555555555D53FABAAAAAAAAAAEA3F0CF71200AC2501 = 18.05.1220.53.001024
E00AE440111111111111EC3F555555555555D53FABAAAAAAAAAAEA3F0CF71200042801 = 18.05.1221.03.001024
E00AE4409FF4499FF449EC3F555555555555D53FABAAAAAAAAAAEA3F0CF712005C2A01 = 18.05.1221.13.001024
E00AE4402ED8822DD882EC3F555555555555D53FABAAAAAAAAAAEA3F0CF71200B42C01 = 18.05.1221.23.001024
E00AE440BCBBBBBBBBBBEC3F555555555555D53FABAAAAAAAAAAEA3F0CF712000C2F01 = 18.05.1221.33.001024
E00AE440176CC1166CC1EC3F555555555555D53FABAAAAAAAAAAEA3F0CF71200482F01 = 18.05.1221.34.001024


E00AE440E42DCDC10BABDA3F555555555555D53FABAAAAAAAAAAEA3F0CF71200A28C00 = 18.05.1210.00.021024
E00AE4401DB1EFD86CABDA3F555555555555D53FABAAAAAAAAAAEA3F0CF71200A48C00 = 18.05.1210.00.041024
E00AE440563412F0CDABDA3F555555555555D53FABAAAAAAAAAAEA3F0CF71200A68C00 = 18.05.1210.00.061024
E00AE44090B734072FACDA3F555555555555D53FABAAAAAAAAAAEA3F0CF71200A88C00 = 18.05.1210.00.081024
E00AE440C93A571E90ACDA3F555555555555D53FABAAAAAAAAAAEA3F0CF71200AA8C00 = 18.05.1210.00.101024
E00AE44002BE7935F1ACDA3F555555555555D53FABAAAAAAAAAAEA3F0CF71200AC8C00 = 18.05.1210.00.121024
E00AE4403C419C4C52ADDA3F555555555555D53FABAAAAAAAAAAEA3F0CF71200AE8C00 = 18.05.1210.00.141024
E00AE44075C4BE63B3ADDA3F555555555555D53FABAAAAAAAAAAEA3F0CF71200B08C00 = 18.05.1210.00.161024
E00AE440AE47E17A14AEDA3F555555555555D53FABAAAAAAAAAAEA3F0CF71200B28C00 = 18.05.1210.00.181024
E00AE440E7CA039275AEDA3F555555555555D53FABAAAAAAAAAAEA3F0CF71200B48C00 = 18.05.1210.00.201024

前言:我尽我所能检查了我正在处理的十六进制似乎不符合“标准”十六进制日期/时间格式(time_t、time_64、DATE、DOS 日期/时间,由 Hex Workshop 计算)以及作为DCode时间解码器应用程序检查的所有格式)。

我正在尝试编写一个批处理对话实用程序来处理由内部未记录的软件生成的适当文件格式。我有能力使用一个被遗忘已久且文档记录也很差的实用程序来转换文件,但这是一个耗时且乏味的过程,我希望将其自动化。

只需使用十六进制编辑器,我就可以找到我需要的一切,除了原始文件中的日期和时间是如何编码的。我确信我已经确定了代表我所追求的数据的 27 字节十六进制序列,因为我可以对其进行编辑以更改日期并将其插入另一个文件以传输日期。但是,我想了解它是如何实际生成的,以便我可以隐藏日期未知的文件。

下面是十六进制序列的示例(左)和它们在转换后的文件中产生的时间戳(右为格式:DD.MM.YYHH.MM.SS)。有些是直接从软件生成的文件中获取的,有些是我手动编辑的序列,以查看日期是如何更改的。任何一年 > 12 的东西都是我修改十六进制的结果。有没有人有什么建议?我不是一个程序员,在这里我很头疼。

80D8E340ABAAAAAAAAAAEE3F555555555555DD3FABAAAAAAAAAAEE = 11.04.1123.00.001024

E008E440555555555555D53F555555555555D53FABAAAAAAAAAAEA = 02.05.1208.00.001024

E001E440555555555555D53F555555555555D53FABAAAAAAAAAAEA = 07.03.1208.00.001024

600AE440000000000000D83FABAAAAAAAAAADA3FABAAAAAAAAAAEE = 14.05.1209.00.001024

610AE440000000000000D83FABAAAAAAAAAADA3FABAAAAAAAAAAEE = 14.05.1209.00.001024

6001E440000000000000D83FABAAAAAAAAAADA3FABAAAAAAAAAAEE = 03.03.1209.00.001024

0101E440555555555555D53F555555555555D53FABAAAAAAAAAAEA = 29.02.1208.00.001024

01010140555555555555D53F555555555555D53FABAAAAAAAAAAEA = 01.01.0008.00.001024

01010101555555555555D53F555555555555D53FABAAAAAAAAAAEA = 30.12.9908.00.001024

600AE440000000000000D83FABAAAAAAAAAADA3FABAAAAAAAAAAEE = 14.05.1209.00.001024

60FFE440000000000000D83FABAAAAAAAAAADA3FABAAAAAAAAAAEE = 25.09.1709.00.001024

60FFE440000000000000D83FABAAAAAAAAAADA3FABAAAAAAAAAAEA = 25.09.1709.00.001024

60FFE440000000000000D83FABAAAAAAAAAADA3FABFFFFFFFFFFEA = 25.09.1709.00.001024

60FFE440000000000000D83FAB0000000000DA3FAB0000000000EA = 25.09.1709.00.001024

01FFE440000000000000D83FAB0000000000DA3FAB0000000000EA = 22.09.1709.00.001024

02FFE440000000000000D83FAB0000000000DA3FAB0000000000EA = 22.09.1709.00.001024

10FFE440000000000000D83FAB0000000000DA3FAB0000000000EA = 22.09.1709.00.001024

20FFE440000000000000D83FAB0000000000DA3FAB0000000000EA = 23.09.1709.00.001024

30FFE440000000000000D83FAB0000000000DA3FAB0000000000EA = 23.09.1709.00.001024

40FFE440000000000000D83FAB0000000000DA3FAB0000000000EA = 24.09.1709.00.001024

50FFE440000000000000D83FAB0000000000DA3FAB0000000000EA = 24.09.1709.00.001024

60FFE440000000000000D83FAB0000000000DA3FAB0000000000EA = 25.09.1709.00.001024

600AE440000000000000D83FAB0000000000DA3FAB0000000000EA = 14.05.1209.00.001024

60FAE440000000000000D83FAB0000000000DA3FAB0000000000EA = 16.08.1709.00.001024

60FAE540000000000000D83FAB0000000000DA3FAB0000000000EA = 26.03.2309.00.001024

60FFE440FFFFFFFFFFFFD83FAB0000000000DA3FAB0000000000EA = 25.09.1709.22.301024

60FFE440010101010101D83FAB0000000000DA3FAB0000000000EA = 25.09.1709.00.051024

40DEE340ABAAAAAAAAAAE63FABAAAAAAAAAACA3FABAAAAAAAAAAE6 = 27.05.1117.00.001024

60DEE340ABAAAAAAAAAAE63FABAAAAAAAAAACA3FABAAAAAAAAAAE6 = 28.05.1117.00.001024

800AE440555555555555D53F555555555555D53FABAAAAAAAAAAEA = 15.05.1208.00.001024

另外,我应该提到最后 14 个字节似乎并不是特别重要(尽管它们在原始文件中确实发生了变化)。例如,以下序列在转换后会产生相同的输出。我不知道这些值是在转换过程中被四舍五入还是被简单地剔除。无论如何,如果我能确定月、日、年、小时、分钟和秒,那部分并不重要。

E008E440555555555555D53F555555555555FFFFFFFFFFFFFFFFFF = 02.05.1208.00.001024

E008E440555555555555D53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF = 02.05.1208.00.001024

E008E440555555555555D53F000000000000000000000000000000 = 02.05.1208.00.001024

以下内容仅由源软件生成,未经手动修改。

40DEE340ABAAAAAAAAAAE63FABAAAAAAAAAACA3FABAAAAAAAAAAE6 = 27.05.1117.00.001024

60DEE340ABAAAAAAAAAAE63FABAAAAAAAAAACA3FABAAAAAAAAAAE6 = 28.05.1117.00.001024

80D8E340ABAAAAAAAAAAEE3F555555555555DD3FABAAAAAAAAAAEE = 11.04.1123.00.001024

E008E440555555555555D53F555555555555D53FABAAAAAAAAAAEA = 02.05.1208.00.001024

600AE440000000000000D83FABAAAAAAAAAADA3FABAAAAAAAAAAEE = 14.05.1209.00.001024

800AE440555555555555D53F555555555555D53FABAAAAAAAAAAEA = 15.05.1209.00.001024

以下是来自不同时间文件的未经修改的十六进制序列:

A0B7E340ABAAAAAAAAAAE63FABAAAAAAAAAACA3FABAAAAAAAAAAE6 = 22.07.1016.00.001024

C0B7E340777777777777E73FABAAAAAAAAAACA3FABAAAAAAAAAAE6 = 23.07.1017.36.001024

A0EFE340CDCCCCCCCCCCE63FABAAAAAAAAAACA3FABAAAAAAAAAAE6 = 13.10.1117.06.001024

80EFE340BCBBBBBBBBBBE63FABAAAAAAAAAACA3FABAAAAAAAAAAE6 = 12.10.1117.03.001024

C0EEE340ABAAAAAAAAAAE13FABAAAAAAAAAACA3FABAAAAAAAAAAE6 = 06.10.1113.15.001024

60D5E340ABAAAAAAAAAACA3FABAAAAAAAAAACA3FABAAAAAAAAAAE6 = 17.03.1105.00.001024

任何帮助或建议将不胜感激。

4

1 回答 1

3

我在解码日期/时间格式方面取得了一些进展。具体来说,我可以读取日期,但我还没有尝试读取时间。

我相信该格式包含许多无关的,可能是垃圾数据;并且只有少数字节有意义。

日期仅以字节 0、1 和 2(前 3 个字节)编码。

将前 4 个字节解释为 little-endian 双字(4 字节)数量 x 是最容易解释的。然后,作为 1989-09-17 的偏移量的天数由下式给出

d = (x & 0x000FFFFF) >> 5

即,您只查看 20 个低位,而忽略其中的 5 个最低位。您可以通过说天数以 5-19 位(包括 5-19 位)编码来总结这一点(特别是,它是一个 15 位的数量)。

可能时间在数据的不同位置被类似地编码,但不同时间的例子并不多,我也需要睡觉!


好的,您提供的许多预先存在的数据(不是您手动生成的数据)似乎都被篡改了时间值(可能是其中一个相关程序转换本地时区的结果)。但只要继续你生成的那些,时间似乎编码如下:

取字节 9 和 10(我指的是第 10 和第 11 字节),并将它们视为小端字 x。屏蔽掉前 2 位,留下 14 位数量:

t = x & 0x3FFF

这代表一天中的时间。它的单位使得 0 对应于 00:00:00,并且(过去)最大值 16384 对应于 24:00:00。这使它的分辨率约为 5.3 秒。

换句话说,

s = t / 16384. * 24. * 60. * 60.

以午夜过后的秒数给出时间.


好的,看看您现在提供的额外字节,字节 32 和 33(最后 2 个字节)似乎是替代时间戳。再次将其视为 little-endian 单词 x,它直接编码从午夜开始的秒数。当它为 0 时,似乎使用了上面描述的时间戳。似乎它只能描述溢出前最多 18:22 的时间,所以它也可能使用之前字节中的额外位?没有足够的数据可以再说了。


字节 34 是上述内容的延续。即,将字节 32、33 和 34 作为 little-endian 3 字节数量,然后,至少当它不为零时,它会给出从午夜开始的秒数,如上所述。

于 2012-05-16T03:48:37.517 回答