Автор |
Сообщение |
Big Digger Гуру |
|
Имеется строка с датой и временем, например:
Код: |
$str = "20080831221000 +0000"; // date("YmdHis O") |
Преобразую эту строку в метку времени UNIX:
Код: |
$timestamp = strtotime($str); // int(1220220600) |
Win32 FILETIME - это 64-битное значение, представляющее число сто-наносекундных интервалов, прошедших с 1 января 1601 года (UTC).
UNIX time_t - это 32-битное значение, представляющее число секунд, прошедших с 1 января 1970 года (UTC).
Разница между этими датами составляет 134,774 дней (или 11,644,473,600 секунд).
К значению метки времени UNIX прибавляю 11,644,473,600 и умножаю на 10,000,000:
Код: |
$filetime = bcmul(bcadd($timestamp, 11644473600), 10000000); // string(18) "128646942000000000"
|
Полученное в строке значение Win32 FILETIME - верное, по сути это unsigned 64-bit integer (unsigned long long).
Вопрос: как упаковать это значение в бинарную строку для записи в файл (длина записи должна быть 8 байт)?
Известная мне функция pack() не поддерживает 64-битные значения.
В математических функциях полный профан...
На скриншоте выделено значение записанное в "правильном" файле:
http://www.adslclub.ru/upload/img/2008-09/2008-04-09_00-19-12_68554.png
|
|
|
|
|
sms Эксперт |
|
если просто требуется изменить время модификации файла, так явно проще:
Код: |
touch("файл.txt",strtotime("20080831221000 +0000")); |
или здесь более глубокий смысл? тогда вот:
Код: |
$s="128646942000000000";
$a=array();
for ($i=0;$i<8;$i++) {
$a[]=bcmod($s,256);
$s=bcdiv($s,256);
}
|
результат (массив, 8 байт, как на скриншоте):
Array ( [0] => 0 [1] => 172 [2] => 89 [3] => 79 [4] => 182 [5] => 11 [6] => 201 [7] => 1 ) |
|
|
|
|
Big Digger Гуру |
|
sms писал(а): |
или здесь более глубокий смысл? |
мне надо из PHP генерить бинарные файлы JTV 3.x TV Program Data
такой уж формат блин...
названия передач пишутся как есть
длина названий, количество записей и смещения-указатели - целые числа
так что тут никаких проблем не возникает
а вот даты и время начала передач нужно записывать как FILETIME |
|
|
|
|
sms Эксперт |
|
Big Digger писал(а): |
мне надо из PHP генерить бинарные файлы |
я добавлял второй вариант в свой пост, разве он не подходит? |
|
|
|
|
Big Digger Гуру |
|
sms писал(а): |
разве он не подходит? |
замечательно подходит )
просто когда писал ответ не было 2го варианта, а потом отвлекся
огромное спасибо! |
|
|
|
|
Big Digger Гуру |
|
может кому-нибудь пригодится...
эти же 8 байт возвращает base_convert
Код: |
base_convert("128646942000000000", 10, 16); // string(15) "1c90bb64f59ac00" |
и обратно
Код: |
base_convert("1c90bb64f59ac00", 16, 10); // string(18) "128646942000000000" |
|
|
|
|
|
|
Аватары: Вкл|Выкл ЮзерИнфо: Вкл|Выкл Подписи: Вкл|Выкл
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы можете скачивать файлы
|
|