Pregunta

¿Cómo puedo obtener la matriz de bytes de alguna cadena que puede contener números, letras y así sucesivamente? Si está familiarizado con Java, Busco la misma funcionalidad de los getBytes () método.

He intentado un fragmento como el siguiente:

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

pero sin éxito, por lo que se aprecia ningún tipo de ayuda.

PS: ¿Por qué necesito esto en absoluto !? Bueno, tengo que enviar a través de una matriz de bytes (fputs) a un servidor escrito en Java ...

¿Fue útil?

Solución

@Sparr es correcto, pero supongo que esperaba matriz de bytes como byte[] en C #. Es la misma solución que hizo Sparr pero en lugar de HEX se espera la presentación int ( rango de 0 a 255 ) de cada char. Usted puede hacer lo siguiente:

$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

Mediante el uso de var_dump se puede ver que los elementos son int ( No 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) }

Tenga cuidado: la matriz de salida es de 1 a base de índice (como se señaló en el comentario)

Otros consejos

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

Array ( [1] => 54686520717569636b20666f78206a756d706564206f76657220746865206c617a792062726f776e20646f67 ) 

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

Se puede dividir el resultado en trozos de dos hexagonal caracteres si es necesario.

Usted podría intentar esto:

$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, las cadenas son bytestreams. ¿Qué estás tratando de hacer?

Re: editar

  

Sal. ¿Por qué necesito esto en absoluto !? Bueno tengo que enviar a través de fputs () ByteArray en el que el servidor escrito en Java ...

fputs toma una cadena como argumento. Lo más probable es que sólo tiene que pasar la cadena a la misma. En el lado de Java de las cosas, usted debe decodificar los datos en cualquier codificación, que está utilizando en php (el valor predeterminado es iso-8859-1).

PHP tiene ningún tipo byte explícita, pero su string ya es el equivalente de matriz de bytes de Java. Puede escribir fputs($connection, "The quick brown fox …") segura. La única cosa que usted debe tener en cuenta es la codificación de caracteres, deben ser la misma en ambos lados. Usar mb_convert_encoding () en caso de duda.

I encontrado varias funciones definidas en http://tw1.php.net/unpack son muy útiles .
Pueden encubierta cadena de matriz de bytes y viceversa.

Tome byteStr2byteArray () como un ejemplo:

<?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]);
}
?>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top