2009-05-19 15 views
37

Come posso ottenere l'array di byte da una stringa che può contenere numeri, lettere e così via? Se hai familiarità con Java, sto cercando la stessa funzionalità del metodo getBytes().Stringa su array di byte in php

ho provato un frammento come questo:

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

ma senza successo, in modo che qualsiasi tipo di aiuto sarà apprezzato.

PS: Perché ho bisogno di tutto questo !? Beh, ho bisogno di inviare un array di byte tramite fputs() per un server scritto in Java ...

risposta

57

@Sparr ha ragione, ma suppongo che ci si aspetta array di byte come byte[] in C#. È la stessa soluzione di Sparr, ma invece di HEX ci si aspettava la presentazione int (da 0 a 255) di ogni char. Si può fare come segue:

$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 

Utilizzando var_dump si può vedere che gli elementi sono int (non 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 per i googler: l'array risultante da unpack ('C *' ha un indice basato su 1, non 0. Ho appena impiegato 20 minuti di debug prima ancora che pensassi di controllare. –

+0

@Bronek o chiunque altro capisca questa domanda qui http : //stackoverflow.com/questions/42189245/how-to-pass-an-array-of-bytes-reference-to-a-com-object-method Ho bisogno della tua assistenza per favore –

5

si potrebbe provare questo:

$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, h = 0x68,. ..

Se necessario, è possibile dividere il risultato in blocchi di caratteri a due esagoni.

+1

Questa non è una soluzione per un problema! – Splendid

+1

@Splendid perché lo dici? – Sparr

+2

la matrice di byte è una matrice di byte, non una stringa esadecimale – Nux

5

In PHP, le stringhe sono bytestreams. Cosa stai cercando di fare esattamente?

Re: edit

Ps. Perché ho bisogno di questo !? Beh, ho bisogno di inviare via fputs() bytearray al server scritto in java ...

fputs prende una stringa come argomento. Molto probabilmente, devi solo passare la stringa ad essa. Sul lato Java delle cose, dovresti decodificare i dati in qualunque codifica, stai usando in php (il default è iso-8859-1).

5

PHP non ha il tipo byte esplicito, ma il suo string è già l'equivalente dell'array di byte di Java. È possibile scrivere in modo sicuro fputs($connection, "The quick brown fox …"). L'unica cosa di cui devi essere a conoscenza è la codifica dei caratteri, devono essere gli stessi su entrambi i lati. Utilizzare mb_convert_encoding() in caso di dubbio.

1

ho trovato diverse funzioni definite in http://tw1.php.net/unpack sono molto utili.
Possono essere nascosti array da stringa a byte e viceversa.

Prendere byteStr2byteArray() come esempio:

<?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

Ciao Albert, grazie per questo Risposta: come passare tutti i printf ("0x% 02x", $ byte_array [$ i]), dopo il ciclo come un oggetto? ad esempio come una matrice di byte a un oggetto COM in Php? –

Problemi correlati