我真的不知道从哪里开始,我做了一些研究但却找不到任何东西。我知道我必须使用日期类,但我需要做的是提取下面突出显示的日期,但是十六进制值是AA,它从哪里得到日期值?
图片在这里,因为它不会让我上传图片:http://www.facebook.com/photo.php?pid=2298915&l=e45630aead&id=1283154964
如果有人知道我会是最棒的!
非常感谢
答案 0 :(得分:0)
Windows将FileTime内部存储为自1.1.1601 UTC以来的100纳秒数作为64位字段。
您是否可以使用JNI并调用Windows API的FileTimeToSystemTime()?如果是这样看一下:
http://msdn.microsoft.com/en-us/library/ms724280(VS.85).aspx
如果不是:
您知道这个64位字段在那里的数据结构中的位置吗?你指出地址03A0B00A('AA'字节),但我发现该字段不太可能位于那里而不是03A0B008甚至03A0B000或03A0B0C0。如果您不知道该字段的地址,您可以通过计算100纳秒格式的日期(29.1.2011)对其进行逆向工程;它不需要精确,你只需要找到最重要的字节,从而你知道64位字段在哪里。我不知道Java是否允许您以纳秒为单位计算相对于1.1.1601 UTC,但正如我所说它不必精确:您可以使用Java来计算自1.1.1601 UTC以来的天数,然后相应地相乘;您可以再次使用此估计值来查找64位字段的地址,然后使用该地址来计算时间。
答案 1 :(得分:0)
文件中的字节为:AA37 D608 DFBF CB01。
您可以在左侧列中看到这被解释为64位整数129407978957060010.如果将其转换回十六进制,您将看到该数字以“little-endian”格式存储:01CB BFDF 08D6 37AA
所以你需要做的是:
byte[] data = new byte[] { (byte) 0xAA, (byte) 0x37, (byte) 0xD6,
(byte) 0x08, (byte) 0xDF, (byte) 0xBF, (byte) 0xCB, (byte) 0x01 };
// convert bytes to long time
long val = 0;
for(int i=7;i>=0;i--) {
val <<= 8;
val += 0xff & data[i];
}
// convert 100 nanos to milliseconds
val /= 10000;
// convert to time offset from 1st Jan 1601 AD
Calendar calend = Calendar.getInstance();
calend.set(1601,0,01,00,00,00);
calend.set(Calendar.MILLISECOND, 0);
val += calend.getTimeInMillis();
calend.setTimeInMillis(val);
// display result
DateFormat df = DateFormat.getDateTimeInstance();
System.out.println(df.format(calend.getTime()));