2010-10-05 19 views
3

J'écris un client pour un protocole de socket binaire en PHP, et c'est une douleur. J'utilise actuellement pack pour convertir des nombres en chaînes binaires, mais ça manque. Deux options pack a sont:Travailler avec des données binaires en PHP

  • Ecrire un signé entier 32 bits dans la machine octet pour
  • Ecrire un entier 32 bits insigned dans le grand ordre endian

Mais je dois d'écrire signé 32 bits entiers dans l'ordre big endian, comme avec Java DataOutputStream.writeInteger. pack n'a pas cette option.

Y a-t-il un moyen de le faire avec pack, ou de transformer la sortie de pack, ou peut-être une meilleure bibliothèque pour travailler avec des données binaires en PHP?

+1

Pas sûr si cela aide, mais ici va: http://www.phpclasses.org/package/2454-PHP-Serialize-and-unserialize-binary-data.html –

Répondre

0

La spécification pour PHP pack() dit que la distinction non signé/signé ne concerne que unpack(), pas pack(). Il suffit donc d'utiliser l'option d'ordre d'octets réseau 32 bits (N).

+0

+ 4 milliards, n'est-ce pas dans le même numéro? Je soupçonne également que ce n'est pas très portable, voir http://stackoverflow.com/questions/300840/force-php-integer-overflow –

+0

@Bart vna Heukelom: Sur la réflexion plus loin, et en vérifiant la documentation, vous pouvez simplement utiliser le option non signée. – caf

2

Utilisez-vous le Zend Framework? Si oui, vous pouvez utiliser la fonction Zend_Io_Writer::writeInt32BE()

Rédige entier signé 32 bits comme big-endian ordonné des données binaires au flux .

Ou bien vous devriez jeter un oeil à la ZF-source comment ces gars-là gérer cela.