Pregunta

Debo incluir el archivo básico de envío y archivo-recepción de las rutinas en mi programa, y debe ser a través del protocolo ZMODEM.El problema es que estoy teniendo problemas para entender la especificación.

Para referencia, aquí está la especificación.

La especificación no define las constantes diferentes, así que aquí está un archivo de encabezado de Google.

Me parece que hay un montón de cosas importantes de la izquierda indefinida en ese documento:

  • Constantemente se refiere a ZDLE-codificación, pero ¿qué es? Cuando es exactamente lo que yo lo uso, y cuando no lo uso?
  • Después de un ZFILE marco de datos, los metadatos del archivo (nombre de archivo, modificar la fecha, el tamaño, etc.) se transfieren.Esto es seguido por una ZCRCW bloque y, a continuación, un bloque cuyo tipo no está definido de acuerdo a las especificaciones.El ZCRCW bloque supuestamente contiene un CRC de 16 bits, pero la especificación no define qué datos el CRC se calcula.
  • No define el polinomio CRC se utiliza.Me enteré por casualidad de que el CRC32 poli es el estándar CRC32, pero no he tenido tanta suerte con el CRC16 poli. No importa, lo encontré a través de ensayo y error.CRC16 poli es 0x1021.

He mirado por el código de referencia, pero todo lo que puedo encontrar son ilegibles, indocumentados C archivos desde principios de los años 90.También he encontrado este conjunto de documentos de la MSDN, pero es muy vagas y contradictorias a las pruebas que me he encontrado: http://msdn.microsoft.com/en-us/library/ms817878.aspx (puede que tenga que ver que a través de La caché de Google)

Para ilustrar mis dificultades, he aquí un ejemplo sencillo.He creado un archivo de texto plano en el servidor que contiene "Hola mundo!", y se llama helloworld.txt.

Yo inicie el traslado desde el servidor con el siguiente comando:

sx --zmodem helloworld.txt

Esto indica que el servidor envíe la siguiente ZRQINIT cuadro:

2A 2A 18 42 30 30 30 30 30 30 30 30 30 30 30 30   **.B000000000000
30 30 0D 8A 11                                    00.Š.

Tres problemas con esto:

  • Son los bytes de relleno (0x2A) arbitrario?¿Por qué hay dos aquí, pero en otros casos sólo hay una, y a veces ninguno?
  • La especificación no menciona el [CR] [LF] [XON] al final, pero el artículo de MSDN hace.¿Por qué está ahí?
  • ¿Por qué el [LF] tiene poco 0x80 conjunto?

Después de esto, el cliente debe enviar un ZRINIT marco.Tengo este desde el artículo de MSDN:

2A 2A 18 42 30 31 30 30 30 30 30 30 32 33 62 65   **.B0100000023be
35 30 0D 8A                                       50.Š

En adición a [LF] 0x80 bandera problema, tengo dos problemas más:

  • ¿Por qué no [XON] incluido este tiempo?
  • Es el CRC calculado sobre los datos binarios o ASCII hexadecimal de datos?Si es en el binario de datos puedo obtener 0x197C, y si es en el ASCII hex datos puedo obtener 0xF775;ninguno de estos es lo que está realmente en la trama (0xBE50). (Solucionado;de ello se deduce sea cual sea el modo que usted está utilizando.Si estás en BIN o BIN32 modo, es el CRC de los datos binarios.Si usted está en ASCII hexadecimal modo, es el CRC de lo que está representado por los caracteres ASCII hex.)

El servidor responde con un ZFILE cuadro:

2A 18 43 04 00 00 00 00 DD 51 A2 33               *.C.....ÝQ¢3

OK.Esto tiene sentido.Si tengo que calcular el CRC32 de [04 00 00 00 00], yo de hecho obtener 0x33A251DD.Pero ahora no tenemos NINGUNA [CR] [LF] [XON] al final.¿Por qué es esto?

Inmediatamente después de este marco, el servidor envía también los metadatos del archivo:

68 65 6C 6C 6F 77 6F 72 6C 64 2E 74 78 74 00 31   helloworld.txt.1
33 20 32 34 30 20 31 30 30 36 34 34 20 30 20 31   3 240 100644 0 1
20 31 33 00 18 6B 18 50 D3 0F F1 11                13..k.PÓ.ñ.

Este ni siquiera tiene un encabezado, sólo salta directamente a los datos.OK, puedo vivir con eso.Sin embargo:

  • Tenemos nuestro primer misterioso ZCRCW cuadro:[18 6B].Cómo de largo es este cuadro?Donde es el CRC de los datos, y es CRC16 o CRC32?No es definida en ningún lugar en la especificación.
  • El artículo de MSDN, se especifica que la [18 6B] debe ser seguido por [00], pero no lo es.
  • A continuación, tenemos un marco con una indefinido tipo:[18 50 D3 0F F1 11].Es este un marco separado o es parte de ZCRCW?

El cliente debe responder con un ZRPOS marco, toma de nuevo desde el artículo de MSDN:

2A 2A 18 42 30 39 30 30 30 30 30 30 30 30 61 38   **.B0900000000a8
37 63 0D 8A                                       7c.Š

Mismos problemas que con la ZRINIT cuadro: el CRC está mal, el [LF] tiene poco 0x80 conjunto, y no hay [XON].

El servidor responde con un ZDATA cuadro:

2A 18 43 0A 00 00 00 00 BC EF 92 8C               *.C.....¼ï’Œ

Mismos problemas como ZFILE:el CRC está todo bien, pero donde esta el [CR] [LF] [XON]?

Después de esto, el servidor envía el archivo de la carga.Dado que este es un breve ejemplo, que encaja en un bloque (el tamaño máximo es de 1024):

48 65 6C 6C 6F 20 77 6F 72 6C 64 21 0A            Hello world!.

A partir de lo que el artículo parece mencionar, las cargas útiles se escapó con [ZDLE].Entonces, ¿cómo puedo transmitir una carga de bytes que coincide con el valor de [ZDLE]?Hay otros valores como este?

El servidor termina con estas imágenes:

18 68 05 DE 02 18 D0                              .h.Þ..Ð
2A 18 43 0B 0D 00 00 00 D1 1E 98 43               *.C.....Ñ.˜C

Estoy perdido en la primera.El segundo hace tanto sentido como la ZRINIT y ZDATA marcos.

¿Fue útil?

Solución

Mi amigo se pregunta si está implementando un tiempo de la máquina.

No sé que me puede contestar todas sus preguntas, nunca he en realidad se tenía que implementar el protocolo zmodem mí ... pero aquí están algunas respuestas:

A partir de lo que el artículo parece mencionar, las cargas útiles se escapó con [ZDLE].Entonces, ¿cómo puedo transmitir una carga de bytes que coincide con el valor de [ZDLE]?Hay otros valores como este?

Esta es abordado explícitamente en el documento vinculado en el principio de tu pregunta, que dice:

The ZDLE character is special.  ZDLE represents a control sequence
of some sort.  If a ZDLE character appears in binary data, it is
prefixed with ZDLE, then sent   as ZDLEE.

Constantemente se refiere a ZDLE-codificación, pero ¿qué es?Cuando exactamente lo puedo usar, y cuando no lo uso?

En los Viejos tiempos, algunos caracteres de control" se utiliza para el control de la canal de comunicación (de ahí el nombre).Por ejemplo, el envío de XON/XOFF caracteres puede pausar la transmisión.ZDLE es usado para escapar los caracteres que pueden ser problemáticos.De acuerdo a la especificación, estos son los caracteres que se escapó por defecto:

ZMODEM software escapes ZDLE, 020, 0220, 021, 0221, 023, and 0223.
If preceded by 0100 or 0300 (@), 015 and 0215 are also escaped to
protect the Telenet command escape CR-@-CR.  The receiver ignores
021, 0221, 023, and 0223 characters in the data stream.

He mirado por el código de referencia, pero todo lo que puedo encontrar son ilegible, indocumentados C archivos desde principios de los años 90.

¿Esto incluye el código para el lrzsz paquete?Esto es aún ampliamente disponible en la mayoría de distribuciones de Linux (y sorprendentemente útil para la transmisión de archivos a través de una conexión ssh establecida).

Hay un número de otras implementaciones, como varias de software que aparece en freshmeat, incluyendo qodem, syncterm, MBSE, y a los demás.Yo creo que el syncterm la aplicación está escrito como biblioteca, que puede ser razonable fácil para utilizar su propio código (pero no estoy seguro).

Usted puede encontrar un código adicional si usted empuje alrededor colecciones más antiguas de MS-DOS software.

Otros consejos

No puedo culpar a usted.El manual del usuario no está organizado de una manera amigable para el usuario

Son los bytes de relleno (0x2A) arbitrario?

No, a partir de la página 14,15:

Un encabezado binario comienza con la secuencia de ZPAD, ZDLE, ZBIN.

Un hex encabezado comienza con la secuencia de ZPAD, ZPAD, ZDLE, ZHEX.

.

La especificación no menciona el [CR] [LF] [XON] al final, pero el artículo de MSDN hace.¿Por qué está ahí?

Página 15

* * ZDLE TIPO B F3/P0 F2/P1 F1/P2 F0/P3 CRC-1 CRC-2 CR LF XON .¿Por qué el [LF] tiene poco 0x80 conjunto?

No estoy seguro.De Tera term yo tengo dos caracteres de control XORed con 0x80 (8D 8A 11)

Tenemos nuestro primer misterioso ZCRCW cuadro:[18 6B].Cómo de largo es este cuadro?Donde es el CRC de los datos, y es CRC16 o CRC32?No es definida en ningún lugar en la especificación.

El ZCRCW no es un encabezado o un tipo de trama, es más como un pie de página que indica al receptor qué esperar en el futuro.En este caso es el pie de página de los datos subpacket que contiene el nombre de archivo.Va a ser de 32 bits de la suma de comprobación debido a que utiliza una "C" de tipo binario encabezado.

  • ZDLE C TIPO F3/P0 F2/P1 F1/P2 F0/P3 CRC-1 CRC-2 CRC-3 CRC-4

.

A continuación, tenemos un marco con una indefinido tipo:[18 50 D3 0F F1 11].Es este un marco separado o es parte de ZCRCW?

Que la CRC para la ZCRCW datos subpacket.Es 5 bytes debido a que el primero es 0x10, un carácter de control que debe ser ZDLE escapado.No estoy seguro de lo 0x11 es.

y no hay [XON].

XON es sólo para el Hexagonal de encabezados.No lo uso para un encabezado binario.

  • ZDLE UN TIPO F3/P0 F2/P1 F1/P2 F0/P3 CRC-1 CRC-2 .Entonces, ¿cómo puedo transmitir una carga de bytes que coincide con el valor de [ZDLE]?

18 58 (AKA ZDLEE)

18 68 05 DE 02 18 D0

Ese es el pie de página de los datos de la subtrama.El próximo 5 bytes de CRC (último byte es ZDLE codificada)

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