Имеется б бинарник, запись которго содержит значение типа FILETIME. Выдержка из msdn: Код (Text): FILETIME Structure Contains a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC). Syntax Copy typedef struct _FILETIME { DWORD dwLowDateTime; DWORD dwHighDateTime; } FILETIME, *PFILETIME; 64-битное значение, представляющие количество 100-наносекундных интервалов, прошедших с 01.01.1601 Имеется необходимость перевести в unix_timestamp, который, как известно имеет 32битную природу. Все бы ничего, можно округлить до секунд значение FILETIME, но как это реализовать на пхп? Можно написать нечто: PHP: function FILETIMEtoUNIXtime($FILETIME) { return round(($FILETIME - 116444736000000000) / 10000000); } Но что передавать в параметре? Ну вычитали 8 байт из файла, сдвинули, проорили (OR), получили переполнение и остались с непонятной хренью в 32 бита. Есть мысли? переименую тему для поисковиков. ибо для пыхи я не смог нагуглить решения...
пока что видится только отдельно привести в таймштампу и к юникс-эпохе старшее слово и младшее, а потом просуммировать. вроде должно получиться. ща попробую.
сделал через float (там пришлось использовать логарифмы)) пришлось, конечно поизвращаться... ничего, что я сам с собой тут беседую?))
Пусть тут будет, вдруг пригодится кому... Код конечно же не претендует на оптимальность, если кто причешет, буду рад. У самого пока времени нет)) PHP: function int2float($i) { $x32 = 4294967296; $i = (float)$i; if ($i < 0) return $i + $x32 + 1; else return $i; /* signed int32 overflow костыль */ } function FILETIMEtoUNIXtime($FILETIME) { // FILETIME is a 64-bit unsigned integer representing // the number of 100-nanosecond intervals since January 1, 1601 // UNIX timestamp is number of seconds since January 1, 1970 $x32 = 4294967296; $sec_btw_epoch = (float)(116444736 * 100); $low = (ord($FILETIME[0])) | (ord($FILETIME[1]) << 8) | (ord($FILETIME[2]) << 16) | (ord($FILETIME[3]) << 24); $high = (ord($FILETIME[4])) | (ord($FILETIME[5]) << 8) | (ord($FILETIME[6]) << 16) | (ord($FILETIME[7]) << 24); $f64 = (int2float($high) * $x32 + int2float($low)) / 10000000; return (int)($f64 - $sec_btw_epoch); }