سؤال

الاقتباسات اثنين:

جميع الرسائل المتبقية في بروتوكول تأخذ شكل <length prefix><message ID><payload>.طول بادئة أربعة بايت big-endian القيمة.الرسالة معرف واحد العشرية بايت.الحمولة هي رسالة تعتمد.

request: <len=0013><id=6><index><begin><length> 

طلب رسالة طول ثابت ، ويستخدم على طلب كتلة.الحمولة يحتوي على المعلومات التالية:

  • مؤشر:صحيح يحدد الصفرية قطعة مؤشر
  • نبدأ:صحيح يحدد صفر على أساس إزاحة البايت داخل قطعة
  • طول:صحيح يحدد المطلوب طول.

عندما أكتب كل شيء مبالغ تصل إلى 5 بايت.باستخدام

ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
byteStream.write( 13 );
byteStream.write( 6 );
byteStream.write( index );
byteStream.write( begin );
byteStream.write( length );

message = byteStream.toByteArray();

تحرير:آسف لقد كنت غاضبه عندما كتبت ذلك.في bittorent البروتوكول.باستخدام هذا المواصفات.

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

المحلول

أسلوب الكتابة() يكتب بايت واحد.

إذا كنت إرساله شار أو الباحث أنه مجرد شرائط كل شيء أعلاه 8 بت مع & 0xFF.

لديك المزيد من الخيارات مع DataOutputStream (writeInt, writeShort.... الخ) ولكنه يستخدم big endian ترتيب بايت لذلك قد تحتاج إلى إجراء عدد صحيح.reverseBytes() (أو قصيرة.reverseBytes()) اتصل قبل تمرير قيمة إلى writeXYZ الأسلوب ().

ByteArrayOutputStream byteStream = new ByteArrayOutputStream();

DataOutputStream dout = new DataOutputStream(byteStream);

dout.writeInt( 0x13 ); // L:4
dout.write( 6 ); // L:5
dout.writeShort( index ); // guess, L:7
dout.writeLong( begin ); // >4GB support? L:15
dout.writeInt( length ); // clients accept below to 2^17, L:19

dout.flush(); // to be sure

message = byteStream.toByteArray();

ملاحظة:المواصفات لا الدولة طول index, begin و length.أردت فقط أن تعطي عينة من الخيارات المتاحة.

تحرير 2: التعديل العينة على أساس D. Shawley الجواب و المواصفات وجدت هنا.

نصائح أخرى

لست متأكدا ما كنت تحصل في هنا...ونقلت النص لا يقول ما طول <index>, <begin>, أو <length> هو.أول اقتباس الدول بدلا من الواضح أن رسالة يتكون من 4 بايت طول ، تليها 1 بايت معرف تعسفية الحمولة.

طول الحمولة هو على الأرجح إما القيمة المحددة كما <length> أو <length>+5 اعتمادا على بالضبط ما <length> يعني.الاقتباس الثاني يبدو تعريف ما الرسالة التي حددها 1 بايت معرف 0x06.أعتقد أن:

  1. الحمولة ، وحدات البايت التي تشكل <index><begin><length>, ربما 14 بايت
  2. طول يتم عرضه في عرافة حتى 0x0013 19 عشري

في أي حال ، البايت دفق أنه يتم إنشاء لا يبدو أن تتطابق مع رسالة تعريف و الرسالة تعريف تفتقر إلى الوضوح.

كتابة() يكتب بايت.5 كتابة()'s تنتج 5 بايت.

انظر write(int b).

يكتب بايت المحدد إلى هذا دفق إخراج.العقد العام للكتابة هو بايت واحد هو مكتوب إلى دفق إخراج.البايت إلى كتب ثمانية الترتيب المنخفض بت حجة ب.24 عالية من أجل بت ب يتم تجاهل.

الفئات الفرعية من OutputStream يجب أن توفر تنفيذ هذا الأسلوب.

المعلمات:ب - بايت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top