IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Encodage byte en PHP


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de natoine
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 393
    Par défaut Encodage byte en PHP
    Bonjour ou plutôt bonsoir.
    J'éspére être au bon endroit pour entamer une discussion au sujet du type byte en php.

    Et bien tout d'abord pour commencer, est-ce que ce type existe?

    Pour ceux qui ne le savent pas, un byte c'est huit bits, un octet en français.
    En gros on a un type int et un type number mais je ne trouve pas de type byte dans le manuel php.

    Je communique par socket avec un serveur en C++ et celui-ci m'envoie un nombre codé sur 4 octets.
    Sauf que quand je lis ces 4 octets, socket_read($socket,4); me renvoie une string.

    J'aimerai donc récupérer la valeur du nombre transmis par le serveur, comment faire?
    www.natoine.fr
    natoine.developpez.com
    Principalement du Java avec un soupçon de réseaux sociaux.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Par défaut
    Salut,

    J'aimerai donc récupérer la valeur du nombre transmis par le serveur, comment faire?
    Il faut utiliser unpack :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $str = "\x01\x02\x03\x04"; // => chaine reçue du serveur
    $array = unpack('N', $str);
    printf("%08x", $array[1]); // => 01020304

  3. #3
    Membre éclairé
    Avatar de natoine
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 393
    Par défaut
    Comment dire, je suis allé sur php.net j'ai regardé les types.
    J'ai trouvé comment représenter un entier en base 10, en base 16, en base 8...
    Mais pas de base 2.

    J'ai essayé le bout de code conseillé, ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $messageLength = socket_read($socket,4);
    $messageLength = unpack('N', $messageLength);
    printf("%08x", $messageLength[1]);
    et qui affiche: d60f0000

    C'est pas tout à fait ce que j'attendais.
    Normalement je devrais recevoir 4054.
    www.natoine.fr
    natoine.developpez.com
    Principalement du Java avec un soupçon de réseaux sociaux.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Par défaut
    Comment dire, je suis allé sur php.net j'ai regardé les types.
    J'ai trouvé comment représenter un entier en base 10, en base 16, en base 8...
    Mais pas de base 2.
    Effectivement on ne peut pas écrire un nombre en base 2 directement en PHP, il faut l'écrire en string et utiliser la fonction bindec(). Mais de toute façon ici c'est hors de propos car tu as une chaine binaire ("\xd6\x0f\x00\x00"), et pas une représentation en ASCII ("d60f0000" ou "11010110000011110000000000000000"), donc tu ne peux pas utiliser hexdec() ou bindec().

    et qui affiche: d60f0000

    C'est pas tout à fait ce que j'attendais.
    Normalement je devrais recevoir 4054.
    C'est un problème d'endianness, qui apparait forcément lorsqu'on converti une représentation binaire en entier. Si tu regardes la doc de pack tu veras toutes les options possibles.
    Dans ton cas, "unsigned long (always 32 bit, little endian byte order)" (V) me semble plus approprié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $messageLength = "\xd6\x0f\x00\x00"; // valeur retournée par socket_read($socket,4);
    $messageLength = unpack('V', $messageLength);
    var_dump($messageLength[1]); // => int(4054)

  5. #5
    Membre éclairé
    Avatar de natoine
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 393
    Par défaut
    Ok merci.

    Ca marche. Trop fort Taum.

    Je copie colle le code d'une classe me permettant de gérer une connection par socket et de communiquer avec un serveur c++ qui m'envoie toujours en premier un entier codé sur 4 octets indiquant la taille du message qui va suivre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    <?php
    class ComServeur{
     
    	// variables initialisées lors de l'appel à init
    	var $adresse;
    	var $port;
    	var $timeLimit;
    	var $socket;
     
    	//variables utiles pour récupérer les messages
    	var $messageLength;
    	var $messageRetour;
     
    	/*
    	Permet d'initialiser les variables de la classe. 
    	Crée notament la socket et la connecte.
    	Aprés cet appel, on peut écrire et lire dans la socket $this->socket.
    	*/
    	function Init($Adresse,$Port,$TimeLimit)
    	{
    		$this->adresse=$Adresse;
    		$this->port=$Port;
    		$this->timeLimit=$TimeLimit;
     
    		error_reporting(E_ALL);
    		set_time_limit($this->timeLimit);
    		ob_implicit_flush();
    		$this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    		socket_connect($this->socket, $this->adresse, $this->port);
    	}
     
    	/*
    	Envoie un message, reçoit le message réponse et affiche la réponse.
    	Appelle SEndMessage, GetMessage et PrintMsg.
    	*/
    	function ReadWritePrint($msg)
    	{
    		$this->SendMessage($msg);
    		$this->GetMessage();
    		$this->PrintMsg();
    	}
     
    	/*
    	Envoie le message $msg via  la socket $this->socket.
    	*/
    	function SendMessage($msg)
    	{
    		socket_write($this->socket, $msg, strlen($msg));
    	}
     
    	/*
    	Réceptionne un message
    	*/
    	function GetMessage()
    	{
    		// Le serveur c++ envoie toujours la taille du  message codé sur 4 octets avant d'envoyer le message
    		$msgLength = socket_read($this->socket,4);
    		$msgLength = unpack('V', $msgLength);
    		//aprés l'appel à unpack('V',$msgLength), le int qui nous intéresse se trouve dans $msgLength[1].
    		$this->messageLength=$msgLength[1];
    		$this->messageRetour=socket_read($this->socket,$this->messageLength);	
    	}
     
    	/*
    	Affiche le message de la variable messageRetour
    	*/
    	function PrintMsg()
    	{
    		echo $this->messageRetour;
    	}
    }
    ?>
    J'ajoute un exemple d'utilisation en local:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    	include 'ComServeur.php';
     
    	$connection=new ComServeur;
    	$connection->Init('localhost',1232,0);
    	$msg="<request code=\"vlgetperspectives\" />";
    	$connection->ReadWritePrint($msg);
     
    ?>
    www.natoine.fr
    natoine.developpez.com
    Principalement du Java avec un soupçon de réseaux sociaux.

  6. #6
    Membre émérite

    Profil pro
    H4X0|2 @ YourLabs Business Service
    Inscrit en
    Octobre 2006
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : H4X0|2 @ YourLabs Business Service
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 657
    Par défaut
    Juste une idée : vous pourrez utiliser stream_socket_select() lorsque vous voudrez écouter la chaussette sans bloquer le script.
    Bravo pour le script.

Discussions similaires

  1. Encodage sqlserver avec php
    Par roy2work dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 08/01/2014, 10h10
  2. Encodage fichier en PHP
    Par aza806 dans le forum Langage
    Réponses: 7
    Dernier message: 17/02/2012, 12h08
  3. Encodage UTF-8 PHP-MYSQL
    Par urubs dans le forum Langages serveur
    Réponses: 1
    Dernier message: 18/05/2011, 19h07
  4. Problème d'encodage des sorties php.
    Par ithurts dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 05/05/2010, 00h57
  5. probleme encodage Byte[] en UTF-8
    Par hduchesn dans le forum Langage
    Réponses: 2
    Dernier message: 20/06/2008, 15h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo