2009-05-19 9 views
37

Wie kann ich die Byte-Array von einer Zeichenfolge, die Zahlen, Buchstaben und so weiter enthalten können? Wenn Sie mit Java vertraut sind, suche ich nach der gleichen Funktionalität der Methode getBytes().String zu Byte-Array in PHP

habe ich versucht, einen Ausschnitt wie diese:

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

aber ohne Erfolg, so dass jede Art von Hilfe geschätzt wird.

PS: Warum muss ich das überhaupt !? Nun, ich brauche einen Byte-Array über fputs senden() an einen Server in Java geschrieben ...

Antwort

57

@Sparr ist richtig, aber ich denke, Sie Byte-Array erwartet wie byte[] in C#. Es ist die gleiche Lösung wie Sparr tat aber statt HEX erwartet Sie int Präsentation (Bereich von 0 bis 255) jedes char. Sie können wie folgt tun:

$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 

von var_dump verwenden, können Sie sehen, dass Elemente int (nicht string) sind.

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

Hinweis für googlers: das resultierende Array von entpacken ('C *' hat einen 1-basierten Index, nicht 0. Ich brauchte nur 20 Minuten Debugging, bevor ich überhaupt dachte zu überprüfen. –

+0

@Bronek oder jemand anderes, der diese Frage hier http versteht : //stackoverflow.com/questions/42189245/how-to-pass-an-array-of-bytes-reference-to-a-com-object-method Ich brauche Ihre Hilfe bitte –

5

Sie können diese versuchen:

$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. ..

Sie können das Ergebnis in zwei-hex-Zeichen Stücke bei Bedarf aufgeteilt.

+1

Diese für ein Problem keine Lösung! – Splendid

+1

@ Splendid warum sagst du das? – Sparr

+2

Byte-Array ist ein Array von Bytes, keine Hex-Zeichenfolge – Nux

5

In PHP Strings sind Bytestreams. Was genau versuchst du zu tun?

Re: bearbeiten

Ps. Warum brauche ich das überhaupt? Nun muss ich über fputs senden() bytearray auf Server in Java geschrieben ...

fputs braucht eine Zeichenkette als Argument. Höchstwahrscheinlich müssen Sie nur Ihre Zeichenfolge an es übergeben. Auf der Java-Seite der Dinge sollten Sie die Daten in jeder Kodierung, die Sie in PHP verwenden, dekodieren (der Standardwert ist iso-8859-1).

5

PHP hat keinen expliziten byte Typ, aber seine string ist bereits das Äquivalent von Java-Byte-Array. Sie können sicher schreiben fputs($connection, "The quick brown fox …"). Das einzige, was Sie beachten müssen, ist die Zeichencodierung, sie müssen auf beiden Seiten gleich sein. Verwenden Sie mb_convert_encoding() im Zweifelsfall.

1

ich in http://tw1.php.net/unpack mehrere Funktionen definiert gefunden sind sehr nützlich.
Sie können String zu Byte-Array konvertieren und umgekehrt.

Nehmen byteStr2byteArray() als Beispiel:

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

Hallo Albert, vielen Dank dafür Antwort: Wie würde ich alle printf übergeben ("0x% 02x", $ byte_array [$ i]), nach der Schleife als ein Objekt, zB als ein Array von Bytes zu einem COM-Objekt in PHP? –