Pregunta

Dos citas:

Todos los mensajes restantes en el protocolo toman la forma de <length prefix><message ID><payload>.El prefijo de longitud es un valor big-endian de cuatro bytes.El ID del mensaje es un único byte decimal.La carga útil depende del mensaje.

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

El mensaje de solicitud tiene una longitud fija y se utiliza para solicitar un bloque.La carga útil contiene la siguiente información:

  • índice:entero que especifica el índice de pieza de base cero
  • comenzar:entero que especifica el desplazamiento de bytes de base cero dentro de la pieza
  • longitud:número entero que especifica la longitud solicitada.

Cuando escribo todo, suma 5 bytes.Usando

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

message = byteStream.toByteArray();

EDITAR:Lo siento, estaba un poco enojado cuando lo escribí.Es el protocolo bittorent.Usando esto Especificaciones.

¿Fue útil?

Solución

El método write() escribe un byte.

Si le envía un carácter char o int, simplemente elimina todo lo que esté por encima del octavo bit con & 0xFF.

Tiene más opciones con DataOutputStream (writeInt, writeShort, etc.) pero utiliza un orden de bytes big endian, por lo que es posible que deba realizar una llamada a Integer.reverseBytes() (o Short.reverseBytes()) antes de pasar el valor a writeXYZ( ) método.

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

Observación:La especificación no indica la longitud de index, begin y length.Sólo quería dar una muestra de las opciones disponibles.

Edición 2: Edité la muestra según la respuesta de D.Shawley y se encontró una especificación. aquí.

Otros consejos

No estoy seguro de lo que está obteniendo aquí ... el texto citado no dice cuál es la longitud de <index>, <begin> o <length>. La primera cita establece, con bastante claridad, que un mensaje consta de una longitud de 4 bytes, seguido de un identificador de 1 byte y una carga útil arbitraria.

La longitud de la carga útil es probablemente el valor especificado como <index><begin><length> o <=> + 5, dependiendo exactamente de lo que significa <=>. La segunda cita se parece a la definición de cualquier mensaje identificado por el identificador de 1 byte de 0x06. Supongo que:

  1. la carga útil, los bytes que componen <=>, es probable que tenga 14 bytes de longitud
  2. la longitud se muestra en hexadecimal, por lo que 0x0013 es 19 decimal

En cualquier caso, la secuencia de bytes que está generando no parece coincidir con la definición del mensaje Y la definición del mensaje carece de claridad.

write () escribe bytes. 5 write () produce 5 bytes.

Ver write(int b) .

  

Escribe el byte especificado en este   flujo de salida. El contrato general   para escribir es que se escribe un byte   a la secuencia de salida. El byte para ser   escrito son los ocho bits de bajo orden de   el argumento b. Los 24 bits de alto orden   de b se ignoran.

     

Subclases de   OutputStream debe proporcionar un   implementación para este método.

     

Parámetros:       b - el byte.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top