문제

두 인용문 :

프로토콜의 나머지 메시지는 모두의 형태를 취합니다. <length prefix><message ID><payload>. 길이 접두사는 4 바이트 빅 엔디안 값입니다. 메시지 ID는 단일 소수점 바이트입니다. 페이로드는 메시지 의존적입니다.

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 프로토콜입니다. 이것을 사용합니다 투기.

도움이 되었습니까?

해결책

Write () 메소드는 하나의 바이트를 씁니다.

char 또는 int를 보내면 & 0xff로 8 비트 이상의 모든 것을 벗겨냅니다.

DataOutputStream (WriteInt, WritesHort 등)에는 더 많은 옵션이 있지만 Big Endian Byte 순서를 사용하므로 Integer.ReverseBytes () (또는 Short.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> 수단. 두 번째 인용문은 0x06의 1 바이트 식별자로 식별되는 메시지의 정의와 같습니다. 나는 그것을 추측 할 것이다 :

  1. 페이로드, 바이트를 구성하는 바이트 <index><begin><length>, 아마도 14 바이트 길이 일 것입니다
  2. 길이는 16 진로 표시되므로 0x0013은 19 십진입니다.

어쨌든 생성하는 바이트 스트림은 메시지 정의와 일치하지 않는 것 같습니다. 그리고 메시지 정의에는 명확성이 부족합니다.

쓰기 ()는 바이트를 작성합니다. 5 write ()는 5 바이트를 생성합니다.

보다 write(int b).

이 출력 스트림에 지정된 바이트를 씁니다. 쓰기 계약은 하나의 바이트가 출력 스트림에 기록된다는 것입니다. 작성해야 할 바이트는 논증의 8 가지 저차 비트입니다. b. B의 24 개 고차 비트는 무시됩니다.

서브 클래스 OutputStream 이 방법에 대한 구현을 제공해야합니다.

매개 변수 : B- 바이트.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top