Java конвертировать шестнадцатеричное время - PullRequest
3 голосов
/ 04 марта 2011

Я действительно понятия не имею, с чего начать, я провел некоторые исследования, но не смог ничего найти. Я знаю, что должен использовать класс даты, но мне нужно вытащить дату, как показано ниже, но шестнадцатеричное значение - AA, откуда оно получает значение даты?

изображение здесь, так как оно не позволяет загружать изображение: http://www.facebook.com/photo.php?pid=2298915&l=e45630aead&id=1283154964

Если кто-нибудь знает, я был бы очень признателен!

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 30 марта 2011

Байты в файле: 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()));
0 голосов
/ 04 марта 2011

Windows хранит FileTime внутри себя как число 100 наносекунд с 1.1.1601 UTC как 64-битное поле.

Возможно ли для вас использовать JNI и вызывать API-интерфейс Windows 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-битного поля, а затем использовать этот адрес для расчета времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...