¿Cómo miden estos 13 bytes?
-
20-08-2019 - |
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.
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:
- la carga útil, los bytes que componen <=>, es probable que tenga 14 bytes de longitud
- 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.