web-dev-qa-db-fra.com

Chaîne en tableau d'octets en php

Comment puis-je obtenir le tableau d'octets à partir d'une chaîne qui peut contenir des chiffres, des lettres, etc.? Si vous connaissez Java, je recherche les mêmes fonctionnalités que la méthode getBytes ().

J'ai essayé un extrait comme celui-ci:

for($i = 0; $i < strlen($msg); $i++){
    $data.=ord($msg[$i]);
        //or $data[]=ord($msg[$1]); 
}

mais sans succès, toute aide sera appréciée.

PS: Pourquoi ai-je besoin de ça du tout!? Eh bien, je dois envoyer un tableau d'octets via fputs () à un serveur écrit en Java ...

45
Splendid

@Sparr a raison, mais je suppose que vous vous attendiez à un tableau d'octets comme byte[] en C #. C'est la même solution que Sparr, mais au lieu de HEX, vous attendiez int présentation (plage de 0 à 255) de chaque char. Vous pouvez procéder comme suit:

$byte_array = unpack('C*', 'The quick fox jumped over the lazy brown dog');
var_dump($byte_array);  // $byte_array should be int[] which can be converted
                        // to byte[] in C# since values are range of 0 - 255

En utilisant var_dump vous pouvez voir que les éléments sont int (pas string).

   array(44) {  [1]=>  int(84)  [2]=>  int(104) [3]=>  int(101) [4]=>  int(32)
[5]=> int(113)  [6]=>  int(117) [7]=>  int(105) [8]=>  int(99)  [9]=>  int(107)
[10]=> int(32)  [11]=> int(102) [12]=> int(111) [13]=> int(120) [14]=> int(32)
[15]=> int(106) [16]=> int(117) [17]=> int(109) [18]=> int(112) [19]=> int(101)
[20]=> int(100) [21]=> int(32)  [22]=> int(111) [23]=> int(118) [24]=> int(101)
[25]=> int(114) [26]=> int(32)  [27]=> int(116) [28]=> int(104) [29]=> int(101)
[30]=> int(32)  [31]=> int(108) [32]=> int(97)  [33]=> int(122) [34]=> int(121)
[35]=> int(32)  [36]=> int(98)  [37]=> int(114) [38]=> int(111) [39]=> int(119)
[40]=> int(110) [41]=> int(32)  [42]=> int(100) [43]=> int(111) [44]=> int(103) }

Attention: le tableau de sortie est à index 1 (comme cela a été souligné dans le commentaire)

75
Bronek
print_r(unpack("H*","The quick fox jumped over the lazy brown dog"))

Array ( [1] => 54686520717569636b20666f78206a756d706564206f76657220746865206c617a792062726f776e20646f67 ) 

T = 0x54, h = 0x68, ...

Vous pouvez diviser le résultat en morceaux de deux hexagones si nécessaire.

26
Sparr

Vous pouvez essayer ceci:

$in_str = 'this is a test';
$hex_ary = array();
foreach (str_split($in_str) as $chr) {
    $hex_ary[] = sprintf("%02X", ord($chr));
}
echo implode(' ',$hex_ary);
7
karim79

PHP n'a pas de type byte explicite, mais son string est déjà l'équivalent du tableau d'octets de Java. Vous pouvez écrire en toute sécurité fputs($connection, "The quick brown fox …"). La seule chose dont vous devez être conscient est le codage des caractères, ils doivent être les mêmes des deux côtés. Utilisez mb_convert_encoding () en cas de doute.

6
soulmerge

En PHP, les chaînes sont des bytestreams. Qu'est-ce que vous essayez de faire exactement?

Re: modifier

Ps. Pourquoi ai-je vraiment besoin de ça!? Eh bien, je dois envoyer via fputs () bytearray au serveur écrit en Java ...

fputs prend une chaîne en argument. Très probablement, il vous suffit de lui passer votre chaîne. Du côté Java côté choses, vous devez décoder les données dans n'importe quel encodage, vous utilisez en php (la valeur par défaut est iso-8859-1).

6
troelskn

J'ai trouvé plusieurs fonctions définies dans http://tw1.php.net/unpack sont très utiles.
Ils peuvent convertir une chaîne en tableau d'octets et vice versa.

Prenons byteStr2byteArray () comme exemple:

<?php
function byteStr2byteArray($s) {
    return array_slice(unpack("C*", "\0".$s), 1);
}

$msg = "abcdefghijk";
$byte_array = byteStr2byteArray($msg);

for($i=0;$i<count($byte_array);$i++)
{
   printf("0x%02x ", $byte_array[$i]);
}
?>
3
Albert Liao