이 13 바이트는 어떻게 길습니까?
-
20-08-2019 - |
문제
두 인용문 :
프로토콜의 나머지 메시지는 모두의 형태를 취합니다.
<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 바이트 식별자로 식별되는 메시지의 정의와 같습니다. 나는 그것을 추측 할 것이다 :
- 페이로드, 바이트를 구성하는 바이트
<index><begin><length>
, 아마도 14 바이트 길이 일 것입니다 - 길이는 16 진로 표시되므로 0x0013은 19 십진입니다.
어쨌든 생성하는 바이트 스트림은 메시지 정의와 일치하지 않는 것 같습니다. 그리고 메시지 정의에는 명확성이 부족합니다.
쓰기 ()는 바이트를 작성합니다. 5 write ()는 5 바이트를 생성합니다.
보다 write(int b)
.
이 출력 스트림에 지정된 바이트를 씁니다. 쓰기 계약은 하나의 바이트가 출력 스트림에 기록된다는 것입니다. 작성해야 할 바이트는 논증의 8 가지 저차 비트입니다. b. B의 24 개 고차 비트는 무시됩니다.
서브 클래스
OutputStream
이 방법에 대한 구현을 제공해야합니다.매개 변수 : B- 바이트.