【问题标题】:Java convert hex to timeJava将十六进制转换为时间
【发布时间】:2011-07-09 01:18:35
【问题描述】:

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

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

如果有人知道我会非常感激!

非常感谢

【问题讨论】:

  • 您在提取十六进制值时遇到问题,或者无法将该十六进制转换为日期?我不确定我能否为您提供帮助,但更多细节可能有助于其他人理解和帮助您。
  • 你知道要转换的十六进制值吗?顺便说一句,这几乎不是一个 Java 问题,您需要了解底层格式,读取字节(不涉及十六进制!),将它们转换为数字(例如,自纪元以来的秒数或格式已定义),然后将数字转换为时间。

标签: java time hex


【解决方案1】:

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 位字段的地址,然后使用该地址来计算时间。

【讨论】:

    【解决方案2】:

    文件中的字节为: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()));
    

    【讨论】:

      猜你喜欢
      • 2015-03-12
      • 2017-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      相关资源
      最近更新 更多