Question

Comment puis-je obtenir le tableau d'octets d'une certaine chaîne qui peut contenir des chiffres, des lettres et ainsi de suite? Si vous connaissez Java, je suis à la recherche de la même fonctionnalité de 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, de sorte que toute sorte d'aide sera appréciée.

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

Était-ce utile?

La solution

@Sparr est juste, mais je suppose que vous attendiez tableau d'octets comme byte[] en C #. Il est la même solution que Sparr a fait, mais au lieu de HEX que vous attendiez la présentation int ( plage de 0 à 255 ) de chaque char. Vous pouvez le faire 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 de l'indice de base 1 (comme il a été souligné dans le commentaire)

Autres conseils

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 caractères à deux hex si nécessaire.

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);

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

Re: modifier

  

Ps. Pourquoi ai-je besoin du tout !? Eh bien, je dois envoyer par fputs () ByteArray au serveur écrit en Java ...

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

PHP n'a pas de type explicite byte, mais son string est déjà l'équivalent du tableau d'octets de Java. Vous pouvez en toute sécurité écrire fputs($connection, "The quick brown fox …"). La seule chose que 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.

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

Prenez 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]);
}
?>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top