Строка в байтовый массив в php - PullRequest
43 голосов
/ 20 мая 2009

Как я могу получить байтовый массив из некоторой строки, которая может содержать цифры, буквы и так далее? Если вы знакомы с Java, мне нужна та же функциональность метода getBytes ().

Я попробовал такой фрагмент кода:

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

но безуспешно, поэтому любая помощь будет оценена.

PS: зачем мне это вообще нужно ?! Что ж, мне нужно отправить байтовый массив через fputs () на сервер, написанный на Java ...

Ответы [ 6 ]

73 голосов
/ 13 июля 2012

@ Спарр прав, но я думаю, вы ожидали байтовый массив, такой как byte[] в C #. Это то же решение, что и Sparr, но вместо HEX вы ожидали int представление ( диапазон от 0 до 255 ) каждого char. Вы можете сделать следующее:

$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

Используя var_dump, вы можете видеть, что элементы int ( не 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) }

Будьте осторожны: выходной массив имеет индекс на основе 1 (как было указано в комментарии)

25 голосов
/ 20 мая 2009
print_r(unpack("H*","The quick fox jumped over the lazy brown dog"))

Array ( [1] => 54686520717569636b20666f78206a756d706564206f76657220746865206c617a792062726f776e20646f67 ) 

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

При необходимости вы можете разбить результат на куски из двух шестнадцатеричных символов.

7 голосов
/ 20 мая 2009

Вы можете попробовать это:

$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);
6 голосов
/ 13 июля 2011

PHP не имеет явного типа byte, но его string уже эквивалентен байтовому массиву Java. Вы можете смело писать fputs($connection, "The quick brown fox …"). Единственное, что вы должны знать, это кодировка символов, они должны быть одинаковыми с обеих сторон. Используйте mb_convert_encoding () , если сомневаетесь.

6 голосов
/ 25 июня 2009

В PHP строки - это потоки байтов. Что именно вы пытаетесь сделать?

Re: редактировать

Ps. Зачем мне это вообще нужно? Ну, мне нужно отправить через fputs () bytearray на сервер, написанный на Java ...

fputs принимает строку в качестве аргумента. Скорее всего, вам просто нужно передать свою строку к нему. Что касается Java, вы должны декодировать данные в любой кодировке, которую вы используете в php (по умолчанию iso-8859-1).

3 голосов
/ 13 февраля 2014

Я нашел несколько функций, определенных в http://tw1.php.net/unpack, очень полезных.
Они могут преобразовывать строку в байтовый массив и наоборот.

Возьмем byteStr2byteArray () в качестве примера:

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