Java将十六进制转换为时间

3
我真的不知道该从哪里开始,我做了一些研究,但是没有找到任何东西。我知道我必须使用日期类,但是我需要提取下面突出显示的日期,但十六进制的值为AA,它从哪里获取日期值?
图片在这里,因为它不允许我上传图片:http://www.facebook.com/photo.php?pid=2298915&l=e45630aead&id=1283154964 如果有人知道,请告诉我,非常感谢!

你是在提取十六进制值方面遇到了问题,还是在将该十六进制转换为日期方面遇到了问题?我不确定我能否帮助你,但更多的细节可能有助于其他人理解并帮助你。 - Kevin D
1
你确切知道要转换的十六进制值吗?顺便说一下,这几乎不是一个Java问题,您需要了解底层格式,读取字节(没有涉及到十六进制!),将它们转换为数字(例如给出自纪元以来的秒数或格式如何定义),然后将数字转换为时间。 - maaartinus
2个回答

0
文件中的字节是:AA37 D608 DFBF CB01。
从左侧列中可以看出,该数字被解释为64位整数129407978957060010。如果您将其转换回十六进制,您会发现该数字以“小端”格式存储: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()));

0

Windows将FileTime以64位字段的形式内部存储为自1601年1月1日UTC以来的100纳秒数。

您是否可以使用JNI并调用Windows API的FileTimeToSystemTime()函数?如果可以,请看这里:

http://msdn.microsoft.com/en-us/library/ms724280(VS.85).aspx

如果不是:

你知道你所拥有的数据结构中这个64位字段位于哪里吗?你指出了地址03A0B00A('AA'字节),但我认为它不太可能位于那里,而可能是03A0B008甚至是03A0B000或03A0B0C0。如果你不知道这个字段的地址,你可以通过计算日期(2011年1月29日)在100纳秒格式中的值来进行反向工程;它不需要很精确,你只需要找到最重要的字节,从而确定64位字段的位置。我不知道Java是否允许你按照相对于1.1.1601 UTC的纳秒计算时间,但正如我所说,它不需要很精确:你可以使用Java计算自1.1.1601 UTC以来的天数,然后相应地进行乘法运算;你可以再次使用这个估计值来找到64位字段的地址,然后从那里开始使用该地址来计算时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接