Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > сохранить целостность данных


Автор: bars80080 17.4.2013, 17:08
возникла заморочка на ровном месте

есть один сервис, куда я отправляю запрос (SOAP) и получаю ответ в виде объекта. 

Код

   respond => Object
      messages => Object
      flights => Object
         flight => Array[128]
            0 => Object
               token => ""
               carrier => Object
                  code => "UT"
                  name => "ЮТэйр"
                  tt_id => "193"
               eticket => "1"
               latinRegistration => ""
...


один параметр этого объекта (token) представляет из себя беспорядочный набор байтов
Код

   messages => Object
   flights => Object
      flight => Array[142]
         0 => Object
            token => "��X[o�F~�_��;��8r-�@WHY��m�Z����i|��!����s���"~R����'Q����3��}�9� V4��:���I�p�DAs����6g�&��(l.ܸD.��?�lq'.�7�g��kSL=���i�Z
E�jc��Nc�����a!��ڀ/{:|o!�%9�XD�
��� F3q��
N���?Š����?E/w�����Lwk�W;�q̢p�Z(y�Wy�1m���^�;�~V4�+mE3:���F����ŶP����$�r�Y��s��S�,T����O���א�saB��ӄz���ɃN��m�&nwz�UpKmh�0\O3i���xZR�T�%�<����/HȾ��B��ΓC�R�cf���'�l�2>v�7�p�Χ�e�hv�a=Gƴ-#%�2�>dN��ł'Iۂ�����>̹�"��<�k���L�*V���~�jW�y�qc �lU6/8r�{w� ��#~L%��,U��"����<�~(�i�ݑsA랋�
�]� �/qy�pQ�&�3���te�~&����1��3�n}%m�B���v�_(w^�z��(+{ƅ���Vw����bg�]�o�m�_Um�@�����i��"N��h̡�i��'(����ڻ��Z�E����&��T��V��4�Όs���e��E���I���������]xp]�%��ɥ� ��v�

Добавлено @ 17:08

при попытке сохранить этот объект (скидываю в файл, затем распаковываю обратно для просмотра и дальнейшего использования), содержимое свойства изменяется:
при попытке свернуть его с помощью serialize, сохраняется только начало, а на каком-то символе происходит обрыв. в результате unserialize уже не способна развернуть объект обратно
при попытке свернуть с помощью json_encode всё содержимое превращается в "token":"\u001f" и всё.

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

каким образом можно было бы свернуть объект с полным сохранением данных?

Добавлено @ 17:10
видите, даже сюда запостить не могу, набор байтов функциями этого форума не перевариваются.

(кстати, найдена уязвимость форума)

какой-то байт закончил передачу, в результате чего вторую половину сообщения пришло добавлять (хорошо, я ожидал этого)

Автор: krundetz 17.4.2013, 17:48
bars80080, самый очевидный выход напрямую работать с бинарными данными, а для их хранения разработать собственный способ, например преобразовать бинарные данные в их строковое представление, что то вида
Код

$binDateStr = '101001 000 111';

Автор: skyboy 17.4.2013, 18:42
Цитата

видите, даже сюда запостить не могу, набор байтов функциями этого форума не перевариваются.

исправлено расползшееся сообщение

Автор: Чучмек 17.4.2013, 23:38
Цитата(bars80080 @  17.4.2013,  17:08 Найти цитируемый пост)
один параметр этого объекта (token) представляет из себя беспорядочный набор байтов

Бинарная строка?
Цитата(bars80080 @  17.4.2013,  17:08 Найти цитируемый пост)
при попытке свернуть его с помощью serialize

А если свернуть только token ?


Автор: bars80080 17.4.2013, 23:45
Цитата(krundetz @  17.4.2013,  17:48 Найти цитируемый пост)
самый очевидный выход напрямую работать с бинарными данными, а для их хранения разработать собственный способ, например преобразовать бинарные данные в их строковое представление, что то вида

предлагаешь pack(), unpack(), base64_encode() попробовать?

попробуем

Добавлено через 44 секунды
Цитата(Чучмек @  17.4.2013,  23:38 Найти цитируемый пост)
А если свернуть только token ?

так он строка и так. смысл его сворачивать?

Добавлено через 1 минуту и 20 секунд
он же ни капли не измениться? только кавычками по борту обзаведётся

Автор: Чучмек 17.4.2013, 23:56
Цитата(bars80080 @  17.4.2013,  23:45 Найти цитируемый пост)
так он строка и так. смысл его сворачивать?

Добавлено через 1 минуту и 20 секунд
он же ни капли не измениться? только кавычками по борту обзаведётся 

Еще добавится тип и длинна. При вызове unserialize учитываются только они.
Я не о том. 
Может виновата структура объекта, а не  
Цитата(bars80080 @  17.4.2013,  17:08 Найти цитируемый пост)
набор содержит байты служебного назначения, которые эти функции не переваривают


Автор: bars80080 18.4.2013, 09:43
сам объект прекрасно сворачивается. у меня две версии этого объекта, сейчас переходим от одной ко второй. основные изменения коснулись методов работы, но в данном объекте изменилось только одно - содержимое свойства token. раньше была человеко-читаемая строка, теперь свалка из байтов, хотя всё прочее осталось без изменений.
так что сам объект очень даже себе валидный и способен к пакованию, что serialize, что json_encode. и только значение token теперь не сохраняется

Автор: Fortop 18.4.2013, 09:50
Цитата(bars80080 @  17.4.2013,  17:08 Найти цитируемый пост)
при попытке сохранить этот объект

сохраняй это поле отдельно от объекта.

Автор: krundetz 18.4.2013, 10:09
Цитата(bars80080 @  17.4.2013,  23:45 Найти цитируемый пост)
предлагаешь pack(), unpack(), base64_encode() попробовать?

да

Автор: bars80080 18.4.2013, 12:46
base64_encode очень хорошо проканал. запаковал без вопросов, а затем распаковал в идентичную запись

всем спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)