adsl club

Справочник

Форум

Программы

Фильмы

Ресурсы

Файлообмен

Хостинг

Ростелеком
PHP: Как упаковать unsigned 64-bit integer в бинарную строку
Ответить на тему    Форум АДСЛ КлубаЦИФРОВОЙ ФЛЕЙМ :)ПРОГРАММИРОВАНИЕ
Автор Сообщение
Big Digger
Гуру
СообщениеДобавлено: Чт 4-09-08 : 00-50    Заголовок сообщения: PHP: Как упаковать unsigned 64-bit integer в бинарную строку Ответить с цитатой

Имеется строка с датой и временем, например:
Код:
$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
Эксперт
СообщениеДобавлено: Чт 4-09-08 : 01-27    Заголовок сообщения: Ответить с цитатой

если просто требуется изменить время модификации файла, так явно проще:
Код:
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
Гуру
СообщениеДобавлено: Чт 4-09-08 : 01-59    Заголовок сообщения: Ответить с цитатой

sms писал(а):
или здесь более глубокий смысл?

мне надо из PHP генерить бинарные файлы JTV 3.x TV Program Data
такой уж формат блин...

названия передач пишутся как есть
длина названий, количество записей и смещения-указатели - целые числа
так что тут никаких проблем не возникает

а вот даты и время начала передач нужно записывать как FILETIME
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
sms
Эксперт
СообщениеДобавлено: Чт 4-09-08 : 02-22    Заголовок сообщения: Ответить с цитатой

Big Digger писал(а):
мне надо из PHP генерить бинарные файлы

я добавлял второй вариант в свой пост, разве он не подходит?
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
Big Digger
Гуру
СообщениеДобавлено: Чт 4-09-08 : 02-59    Заголовок сообщения: Ответить с цитатой

sms писал(а):
разве он не подходит?

замечательно подходит )
просто когда писал ответ не было 2го варианта, а потом отвлекся
огромное спасибо!
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
Big Digger
Гуру
СообщениеДобавлено: Пт 5-09-08 : 16-57    Заголовок сообщения: Ответить с цитатой

может кому-нибудь пригодится...
эти же 8 байт возвращает base_convert
Код:
base_convert("128646942000000000", 10, 16); // string(15) "1c90bb64f59ac00"

и обратно
Код:
base_convert("1c90bb64f59ac00", 16, 10); // string(18) "128646942000000000"
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
Показать сообщения:   
Ответить на тему    Форум АДСЛ КлубаЦИФРОВОЙ ФЛЕЙМ :)ПРОГРАММИРОВАНИЕ Часовой пояс: GMT + 7
Страница 1 из 1

 

 
Аватары: Вкл|Выкл   ЮзерИнфо: Вкл|Выкл   Подписи: Вкл|Выкл
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы можете скачивать файлы