2009-05-19 29 views
37

¿Cómo puedo obtener la matriz de bytes de una cadena que puede contener números, letras, etc.? Si está familiarizado con Java, estoy buscando la misma funcionalidad del método getBytes().Cadena a matriz de bytes en php

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 apreciará cualquier tipo de ayuda.

PD: ¿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 ...

Respuesta

57

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

$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) } 
+8

Nota para googlers: la matriz resultante de unpack ('C *' tiene un índice basado en 1, no 0. Simplemente me tomó 20 minutos de depuración incluso antes de pensar en verificar. –

+0

@Bronek o cualquier otra persona que entienda esta pregunta aquí http : //stackoverflow.com/questions/42189245/how-to-pass-an-array-of-bytes-reference-to-a-com-object-method Necesito su ayuda por favor –

5

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); 
21
print_r(unpack("H*","The quick fox jumped over the lazy brown dog")) 

Array ([1] => 54686520717569636b20666f78206a756d706564206f76657220746865206c617a792062726f776e20646f67) 

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

Puede dividir el resultado en dos trozos de caracteres hexadecimales si es necesario.

+1

Esto no es una solución para un problema! – Splendid

+1

@Splendid ¿por qué dices eso? – Sparr

+2

array de bytes es una matriz de bytes, no una cadena hexadecimal – Nux

5

En PHP, las cadenas son bytestreams. ¿Qué estás tratando de hacer exactamente?

Re: editar

Sal. ¿Por qué necesito esto en absoluto? Bueno, necesito enviar vía fputs() bytearray al servidor escrito en java ...

fputs toma una cadena como argumento. Lo más probable es que solo tengas que pasarle la cuerda. En lo que respecta a Java, debe decodificar los datos en cualquier codificación que esté utilizando en php (el valor predeterminado es iso-8859-1).

5

PHP no tiene el tipo explícito byte, pero su string ya es el equivalente de la matriz de bytes de Java. Puede escribir con seguridad fputs($connection, "The quick brown fox …"). Lo único que debes tener en cuenta es la codificación de caracteres, deben ser iguales en ambos lados. Use mb_convert_encoding() en caso de duda.

1

encontré varias funciones definidas en http://tw1.php.net/unpack son muy útiles.
Pueden encubrir cadena a matriz de bytes y viceversa.

Take 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]); 
} 
?> 
+0

Hola Albert, gracias por esto Respuesta: ¿Cómo pasaría todos los printf ("0x% 02x", $ byte_array [$ i]), después del bucle como un objeto, por ejemplo, como una matriz de bytes para un objeto COM en Php? –

Cuestiones relacionadas