سؤال

كيف يمكنني الحصول على صفيف البايت من بعض السلسلة التي يمكن أن تحتوي على أرقام أو أحرف وهلم جرا؟ إذا كنت على دراية بجافا، فأنا أبحث عن نفس وظائف GetBytes ().

حاولت مقتطف مثل هذا واحد:

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

ولكن بدون نجاح، لذلك سيتم تقدير أي نوع من المساعدة.

ملاحظة: لماذا أحتاج إلى هذا على الإطلاق!؟ حسنا، أحتاج إلى إرسال صفيف بايت عبر Futs () إلى خادم مكتوب في Java ...

هل كانت مفيدة؟

المحلول

sparr هو الصحيح، ولكن أعتقد أنك توقعت مجموعة البايت مثل byte[] في ج #. إنه الحل نفسه كما فعل سبار ولكن بدلا من عرافة كنت تتوقع 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 يمكنك أن ترى أن العناصر هي int (ليس 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) }

كن حذرا: يتمثل صفيف الإخراج من مؤشر واحد (كما تم الإشارة إليه في التعليق)

نصائح أخرى

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

Array ( [1] => 54686520717569636b20666f78206a756d706564206f76657220746865206c617a792062726f776e20646f67 ) 

T = 0x54، H = 0x68، ...

يمكنك تقسيم النتيجة إلى قطع ثنائية عشرية إذا لزم الأمر.

يمكنك تجربة هذا:

$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);

في PHP، السلاسل هي bytestreams. ما الذي تحاول القيام به بالضبط؟

إعادة: تحرير

ملاحظة. لماذا أحتاج هذا على الإطلاق!؟ حسنا، أحتاج إلى إرسال عبر fputs () bytearray إلى الخادم مكتوب في Java ...

fputs يأخذ سلسلة كوسيطة. على الأرجح، تحتاج فقط إلى اجتياز سلسلة الخاص بك إليها. على جانب Java من الأشياء، يجب عليك فك شفرة البيانات في أي ترميز، وتستخدم في PHP (الافتراضي ISO-8859-1).

PHP لا يوجد لديه صريح byte اكتب، ولكن لها string هو بالفعل ما يعادل صفيف بايت جافا. يمكنك الكتابة بأمان fputs($connection, "The quick brown fox …"). وبعد الشيء الوحيد الذي يجب أن تكون على دراية به هو ترميز الأحرف، يجب أن تكون هي نفسها على كلا الجانبين. يستخدم mb_convert_encoding () في حالة الشك.

لقد وجدت العديد من الوظائف المعرفة في 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]);
}
?>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top