55

数字や文字などを含む文字列からバイト配列を取得するにはどうすればよいですか?Javaに精通している場合は、getBytes()メソッドと同じ機能を探しています。

私はこのようなスニペットを試しました:

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

しかし成功しなかったので、どんな種類の助けもありがたいです。

PS:なぜこれが必要なのですか!?さて、私はfputs()を介してJavaで書かれたサーバーにバイト配列を送信する必要があります...

4

6 に答える 6

89

byte[]@Sparrは正しいですが、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)であることがわかります。intstring

   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ベースのインデックスです(コメントで指摘されているように)

于 2012-07-13T08:22:52.483 に答える
28
print_r(unpack("H*","The quick fox jumped over the lazy brown dog"))

Array ( [1] => 54686520717569636b20666f78206a756d706564206f76657220746865206c617a792062726f776e20646f67 ) 

T = 0x54、h = 0x68、..。

必要に応じて、結果を2つの16進文字のチャンクに分割できます。

于 2009-05-20T00:29:26.660 に答える
8

PHPには明示的なbyte型はありませんが、stringすでにJavaのバイト配列と同等です。安全に書くことができますfputs($connection, "The quick brown fox …")。注意しなければならないのは文字エンコードだけです。文字エンコードは両側で同じである必要があります。疑わしい場合は、 mb_convert_encoding()を使用してください。

于 2011-07-13T11:48:25.363 に答える
7

あなたはこれを試すことができます:

$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);
于 2009-05-19T23:59:32.583 に答える
6

PHPでは、文字列はバイトストリームです。正確に何をしようとしていますか?

再:編集

追伸 なぜこれが必要なのですか!?さて、私はfputs()bytearrayを介してJavaで書かれたサーバーに送信する必要があります...

fputs引数として文字列を取ります。ほとんどの場合、文字列を渡す必要があります。Java側では、phpで使用しているエンコーディング(デフォルトはiso-8859-1)でデータをデコードする必要があります。

于 2009-06-24T20:30:26.960 に答える
4

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]);
}
?>
于 2014-02-13T05:53:16.050 に答える