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 ...
@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)
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.
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);
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.
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).
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]);
}
?>