2010-10-05 7 views
3

Я пишу клиент для двоичного протокола сокета в PHP, и это боль. В настоящее время я использую pack для преобразования чисел в двоичные строки, но этого не хватает. Два варианта pack имеет следующие:Работа с двоичными данными в PHP

  • Написать подписанную 32 разрядное целое число в машинном порядке байт
  • Напишите insigned 32 разрядное целое число в большой Endian порядок байт

Но мне нужно, чтобы написать подписал 32 бит целые числа в большем концевом порядке, как и в Java DataOutputStream.writeInteger. pack не имеет этого варианта.

Есть ли способ сделать это с помощью pack или преобразовать вывод pack или, может быть, лучшую библиотеку для работы с двоичными данными в PHP?

+1

Не уверен, что это помогает, но здесь идет: http://www.phpclasses.org/package/2454-PHP-Serialize-and-unserialize-binary-data.html –

ответ

0

Спецификация для PHP pack() говорит о том, что различие без знака/подписи имеет значение только для , а не pack().

Так что просто используйте 32-битный сетевой порядок байтов (N).

+0

+ 4 миллиарда, не так ли получается в том же количестве? Я также подозреваю, что это не очень портативно, см. Http://stackoverflow.com/questions/300840/force-php-integer-overflow –

+0

@Bart vna Heukelom: при дальнейшем анализе и проверке документации вы можете просто использовать без знака. – caf

2

Вы используете Zend Framework? Если да, то вы можете использовать функцию Zend_Io_Writer::writeInt32BE()

Записывает 32-разрядное целое число, как большой обратный порядок байт заказал двоичные данные в потоке.

Или еще вы должны взглянуть на ZF-source, как эти парни справляются с этим.

Смежные вопросы