2010-11-11 7 views
1

Ceci concerne les données envoyées via une socket à une application C résidant sur un système de point de vente distant.Données binaires du pack PHP

Les données binaires sont envoyées à partir d'une application php, dans la structure de paquets de l'application C, 64 octets sont stockés pour une chaîne, par ex. un nom de produit.

Maintenant, quand je passe le nom du produit à travers le réseau via des sockets php, j'utiliser paquet pour convertir les données en binaire

$value = 'product name' 
$qty = 2; 
$len = strlen($value); 
$output = ''; 
for($i=0; $i<$len; $i++) { 
     $output .= pack('c', ord(substr($value, $i, 1))).pack('c',$qty) 
} 

Lorsque les données sont reçues par l'application C la chaîne contient beaucoup de données à ordures, y compris les chiffres et les caractères spéciaux.

Laquelle des options de pack je dois utiliser pour emballer le nom du produit dans une chaîne binaire 64 bits qui sera interprétée par l'application C dans le format correct.

+1

Poster la structure C déclaration * en toto * . – tchrist

+0

Peut-être attend-il une chaîne terminée par zéro. –

Répondre

0

Votre boucle pour construire $output produit une chaîne comme "p\x02r\x02o\x02d\x02u\x02c\x02t\x02 \x02n\x02a\x02m\x02e\x02"

Si votre programme C attend quelque chose comme "product name\0\x02", la boucle doit être:

$output = ''; 
for($i=0; $i<$len; $i++) { 
     $output .= pack('c', ord(substr($value, $i, 1))); 
} 
$output .= pack('c',0).pack('c',$qty); 
+0

Oui, c'est exactement ce que je devais faire pour résoudre le problème. On remplissait la chaîne avec \ 0 car la taille attendue pour chaque chaîne était 64. et la 2ème étape est la même que celle de votre code concaténer la quantité plus tard. – user160108

0

L'envoi de données binaires via des sockets réseau peut également créer des problèmes avec l'ordre des octets (Endianess), vous pouvez vérifier si l'ordre des octets est le même sur les deux systèmes. http://en.wikipedia.org/wiki/Endianness

+0

Les Endianess sur les deux systèmes sont les mêmes que les commandes utilisées dans le protocole sont interprétées correctement. Cela se produit uniquement dans le cas des données de chaîne transmises. Dans le cas de données telles que payload, somme de contrôle, commande et en-tête, les données sont transmises en tant que pack ('N', $ data); – user160108

+0

Pourrait-il y avoir un problème avec les chaînes utf8, car toutes les chaînes stockées dans ma base de données sont codées en utf8 – user160108