За последние 24 часа нас посетил 19301 программист и 1739 роботов. Сейчас ищут 1093 программиста ...

Бинарная строка

Тема в разделе "Прочее", создана пользователем iliavlad, 5 ноя 2009.

  1. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    Может кто подскажет решение попроще)

    Задача. Есть система, которая выдает данные, частью которых является дата. Необходимо к этой дате прибавить один день и вернуть в систему. Дата хранится в бинарной строке как показано ниже.

    PHP:
    1. <?php
    2. $bin_date = pack('C5', 0x09, 0x07, 0x24, 0x03, 0x44); // входные данные день 24 месяц 07 год 09 часы 03 минуты 44 [b](именно так 0х24 - это 24ое число)[/b]
    3. $hex = bin2hex($bin_date);                            // var_dump($hex) string(10) "0907240344"
    4. $hex_a = str_split($hex, 2);                          // var_dump($hex_a) array(5) [0]=>str(2)"09" [1]=>str(2)"07" [2]=>str(2)"24" [3]=>str(2)"03" [4]=>str(2)"44"
    5. $dec_a = array_map('intval', $hex_a);                 // var_dump($dec_a) array(5) [0]=>int(9) [1]=>int(7) [2]=>int(24) [3]=>int(3) [4]=>int(44)
    6. ++$dec_a[2];                                          // бизнес-логика, ули. var_dump($dec_a) array(5) [0]=>int(9) [1]=>int(7) [b][2]=>int(25)[/b] [3]=>int(3) [4]=>int(44)
    7. $time = mktime($dec_a[3], $dec_a[4], 0, $dec_a[1], $dec_a[2], $dec_a[0]); // var_dump($time) int(1248453840)
    8. $res_s = date('ymdHi', $time);                        // var_dump($res_s) string(10) "0907250344"
    9. $res_a_h = str_split($res_s, 2);                      // var_dump($res_a_h) array(5) [0]=>str(2)"09" [1]=>str(2)"07" [2]=>str(2)"25" [3]=>str(2)"03" [4]=>str(2)"44"
    10. $res_a_d = array_map('hexdec', $res_a_h);             // var_dump($res_a_d) array(5) [0]=>int(9) [1]=>int(7) [2]=>int(37) [3]=>int(3) [4]=>int(68)
    11. $res_a_b = array_map('chr', $res_a_d);                // делаем символы по кодам
    12. $res = implode($res_a_b);                             // объединяем в строку var_dump(bin2hex($res)) string(10) "0907250344" день 25
    13. ?>
     
  2. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    $bin_date[2] = chr(ord($bin_date[2]) + 1);

    Одного не понимаю... какого черта 0x24? ведь это 36
     
  3. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    вернет не 24
    может выдать овер 31 день
     
  4. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    входные данные. менять нельзя.
     
  5. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Дык, какой идиот их так дал?

    Просто, основные танцы с бубном из-за идиотического положения

    что 0d24 == 0x24
     
  6. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    не хочешь - не бери.