Java将十六进制转换为时间

时间:2011-03-04 18:55:15

标签: java time hex

我真的不知道从哪里开始,我做了一些研究但却找不到任何东西。我知道我必须使用日期类,但我需要做的是提取下面突出显示的日期,但是十六进制值是AA,它从哪里得到日期值?

图片在这里,因为它不会让我上传图片:http://www.facebook.com/photo.php?pid=2298915&l=e45630aead&id=1283154964

如果有人知道我会是最棒的!

非常感谢

2 个答案:

答案 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()));