2011-07-13 1 views
1

Le code C# suivant est utilisé dans un service dont j'ai hérité, pour convertir un petit entier en 3 octets afin qu'il puisse être envoyé sur un socket. Utilisation de PHP J'ouvre une socket au service. Le protocole de communication est écrit au niveau octet, donc je dois envoyer des octets sur le socket PHP.Comment utiliser la fonction PHP Pack pour empaqueter un entier dans un tableau d'octets?

J'ai déterminé que pour ce faire, je dois utiliser la fonction pack.

<?php 
    $binarydata = pack("CCCC", 0xFF, 0x00, 0x00, 0x00); 
socket_write($sk, $binarydata, $binarydataLen); 
    ?> 

Le premier octet indique au serveur ce que le client veut faire, et dans ce cas, les 3 octets suivants doivent représenter un nombre entier conforme aux formules indiquées dans la mise en œuvre de C# ci-dessus.

Le problème que j'ai, peu importe ce que j'essaie, je ne peux pas créer le tableau de 3 octets à partir d'un entier qui correspond à l'implémentation C#.

J'apprécierais vraiment et voterais n'importe qui qui peut m'aider à résoudre ceci, pour un développeur PHP expérimenté je pense qu'ils pourraient connaître la bonne syntaxe à utiliser.

Merci. Christian

Edit: Voici prototype

//The Client 
error_reporting(E_ALL); 

$address = "127.0.0.1"; 
$port = <removed>; 

/* Create a TCP/IP socket. */ 
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
if ($socket === false) { 
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n"; 
} else { 
    echo "socket successfully created.\n"; 
} 

echo "Attempting to connect to '$address' on port '$port'..."; 
$result = socket_connect($socket, $address, $port); 
if ($result === false) { 
    echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n"; 
} else { 
    echo "successfully connected to $address.\n"; 
} 

    $value = 17; 
    $binarydata = pack("c*", 0xFE, $value & 0x000F, ($value>>8) & 0x000F, ($value>>16) & 0x000F); 
    socket_write($socket, $binarydata, 4); 
    $input = socket_read($socket, 2048); 
    echo "Response from server is: $input\n"; 


    sleep(5); 

echo "Closing socket..."; 
socket_close($socket); 

Le résultat attendu est "FE 11 00 00" (11 étant 17)

Malheureusement, il est l'envoi "FE 01 00 00" selon aux logs :-(

Le serveur répond en ASCII donc j'ai juste besoin d'obtenir ce numéro à droite car il va changer dynamiquement

EDIT: MERCI TOUT, SON TRAVAIL! xD

$binarydata = pack("cc*", 0xFE, $value, ($value>>8), ($value>>16)); 

Répondre

1

le format "nvc *" est incorrect. Cela va générer 6 octets. Vous devriez faire ceci:

$binarydata = pack("c*", $value & 0x000F, ($value>>8) & 0x000F, ($value>>16) & 0x000F); 
+0

Merci, ça a l'air bien, je vais l'essayer. – Chris

+0

J'ai mis le prototype dans les éditions ci-dessus, sa fin, mais envoie toujours la mauvaise valeur pour une raison quelconque, voulez-vous jeter un oeil? Merci beaucoup! – Chris

+0

J'ai commencé à travailler: $ binarydata = pack ("cc *", 0xFE, $ valeur, ($ valeur >> 8), ($ valeur >> 16)); – Chris

1

Comme vous écrivez octets d'emballage, ne doit pas être la fonction utilisée comme celui-ci?

$binarydata = pack("CCCC", 0xFF, 0x00, 0x00, 0x00); 
+0

Oui Je pense que vous avez raison! $ binarydata = pack ("CCCC", 0x74, 0x65, 0x73, 0x74); die ($ binarydata); = test – Chris

Questions connexes