2011-03-04 101 views
3

我真的不知道从哪里开始,我已经做了一些研究,但无法找到任何东西。我知道我必须使用日期类,但我需要做的是拉出日期如下面突出显示,但十六进制值是AA,它从哪里得到日期值?Java将十六进制转换为时间

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

如果有任何人知道我将不胜感激!

非常感谢

+0

你有麻烦拉动十六进制值,或麻烦十六进制转换为日期?我不确定我能够帮助你,但更多的细节可以帮助他人理解和帮助你。 – 2011-03-04 19:18:21

+1

您是否确切知道要转换的十六进制值?顺便说一句,这不是一个Java问题,你需要了解底层的格式,读取字节(* no hex involved!*),将它们转换为数字(例如自Epoch开始,或者定义格式)然后将该数字转换为时间。 – maaartinus 2011-03-04 19:33:40

回答

0

的Windows存储自1601年1月1日UTC为64场内部FILETIME为100纳秒数。

是否有可能使用JNI并调用Windows API的FileTimeToSystemTime()?如果是的话看看这里:

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

如果不是:

你知道这64场坐落在你那里的数据结构?您指出了地址03A0B00A('AA'字节),但是我发现该字段不可能位于那里,而不是03A0B008甚至03A0B000或03A0B0C0。如果你不知道这个字段的地址,你可以通过计算日期(29.1.2011)以100纳秒的格式进行反向工程;它不需要精确,你只需要找到最重要的字节,因此你就知道64位字段在哪里。我不知道Java是否允许你以相对于1.1.1601 UTC的纳秒计算,但正如我所说的那样,它不需要精确:你可以使用Java来计算自1.1.1601 UTC以来的天数,然后进行相应的乘法运算;您可以再次使用此估算值查找64位字段的地址,然后使用该地址计算时间。

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