CETTE DOCUMENTATION DECRIT L'ALGORITHME ProTrans v1.0 POUR TRANSMETRE DES FICHIERS UNIQUEMENT POUR LES TRANSFERTS EN 7 BITS (Minitel) Protocole invent‚ et mis au point par Olivier Marcoux Reportez vous au glossaire en fin de doc pour l'explication de certain termes La version 1.0 de Protrans est cod‚e 00 ( CHR(0) ) I) Dialogue entre les protocoles: Chaque transmission commence par un 01 ce qui permet aux protocoles de se repositionner en cas d'erreurs A tout moment, un des deux protocoles peut interrompre tout le transfert en envoyant 01 7F II) Reception d'un fichier Etapes: -1- Attendre la sequence 01 02 03 04 vv (vv est la version du protocole emetteur) si le 8eme bit de vv est mis, une transmission 8 bits est possible -2- Renvoyer 01 ww ww est la version la plus ancienne entre la votre et celle de l'emetteur (il faut fixer le 8eme bit de ww pour un envoi 8 bits) Les 2 protocoles doivent alors respecter les caracteristiques propres … la version ww du protocole -3- Reception du bloc #0 (en-tete) Le format de ce bloc est expliqu‚ plus loin dans cette doc... -4- Trois cas: * Si le bloc a mal ‚t‚ recu: On envoie alors 01 03 (c'est le "NAK" du protocole) et on recommence la reception de l'en-tete en -3- * Si il existe deja un fichier du meme nom que celui qui va etre transmis: On envoie alors 01 04 ttttt (reprise de la reception du fichier) LA REPRISE N'EST PAS DECRITE DANS CETTE DOCUMENTATION. FAITES ACK A LA PLACE ET ECRASEZ LE FICHIER EXISTANT (ou demandez a l'utilisateur s'il prefere pas arreter le transfert...) * Si tout est correct: On envoie alors 01 02 (c'est le "ACK" du protocole) -5- R‚ception du bloc #x Le Format de ces blocs est expliqu‚ plus loin dans cette doc... -6- Deux cas: * Si le bloc a mal ‚t‚ recu: On envoie alors 01 03 et on recommence la reception du meme bloc en -5- * Si le bloc a bien ‚t‚ recu: On envoie alors 01 02 Si le fichier a ‚t‚ transmis entierement, on continue en -7- Sinon on commence la reception du bloc suivant en -5- -7- Fin du transfert... III) Format du bloc d'en-tete L'En-Tete est transmis A L'INTERIEUR D'UN BLOC Ce qui est decrit dans cette partie est le contenu du bloc recu apres avoir ‚t‚ trait‚ comme dans la partie IV)... L'En-Tete est de la forme: ntt..ttddddssss ---+--------------------------------------------+---------- | description |taille ---+--------------------------------------------+---------- n |Nombre de caracteres dans le nom du fichier | 1 |(on ajoute 32 a ce nombre) | octets ---+--------------------------------------------+---------- t |Nom du Fichier (generalement on n'incluera | n-32 | pas le chemin d'acces au fichier) | octets ---+--------------------------------------------+---------- d |Date et Heure de Derniere Modification du | 4 | Fichier (Encodage DOS expliqu‚ plus loin) | octets ---+--------------------------------------------+---------- s |Taille du fichier (entier long) | 4 | | octets ---+--------------------------------------------+---------- IV) Format d'un bloc ProTrans 01 l1 l2 dt ct cc c7 c8 dd..dd 04 ----+--------------------------------------------+---------- | description |taille ----+--------------------------------------------+---------- l1 |Indique la taille en octets de la zone de | 2 l2 | donn‚es dd..dd taille=(l1-32)*96+(l2-32) | octets ----+--------------------------------------------+---------- dt |Delta Taille + 32 | 1 | (description plus bas) | octet ----+--------------------------------------------+---------- ct |Code Trap | 1 | (description plus bas) | octet ----+--------------------------------------------+---------- cc |Code de Compression (00=pas de compression) | 1 | (description plus bas) | octet ----+--------------------------------------------+---------- c7 |CRC 7 bits, calcul du CRC sur la zone dd..dd| 1 | (description plus bas) | octet ----+--------------------------------------------+---------- c8 |CRC 8 bits, calcul du CRC sur les donn‚es du| 1 | bloc trait‚ (description plus bas) | octet ----+--------------------------------------------+---------- dddd|Donn‚es du bloc | 1 | (description plus bas) | octet ----+--------------------------------------------+---------- V) Traitement des donn‚es 5.1 Etapes: -1- Calcul et Verification du CRC7 -2- Remplacement des Codes Trap -3- D‚compression du Bloc (s'il est compress‚) La taille des donn‚es doit alors etre multiple de 8. -4- Recomposition du bloc 8 bits On obtient alors un bloc de taille multiple de 7 -5- Retrait des dt (Delta Taille) derniers caracteres du bloc -6- Calcul et Verification du CRC8 5.2 Calcul du CRC7 -1- crc=0 puis pour chaque caractere de code ascii c -2- crc = (crc * 2) AND $7F -3- crc = crc XOR c XOR $5A 5.3 Remplacement des Codes Trap -1- Rechercher les 6 prochains caracteres Trap dans le bloc de donn‚es. -2- Enlever le dernier caractŠre du bloc de donn‚es et le mettre dans c -3- Faire c = c - 32 -4- les bits 0 … 5 de c indique par quoi doivent etre chang‚ le 1er...6eme Code Trap trouv‚. Si le bit trouv‚ est fix‚, le Code Trap correspondant doit etre remplac‚ par un ESC (27), sinon il doit etre inchang‚ 5.4 D‚compression du Bloc (s'il est compress‚) le bloc est compress‚ si le Code de Compression est different de 00 -1- Rechercher le prochain Code de Compression dans le bloc de donn‚es. -2- Mettre dans c le caractŠre qui suit ce code si c = 0, on retire ce caractŠre (celui qui suit le code de compression) du bloc de donn‚e et on continue la recherche en -1- si c > 27 alors on fait c = c - 1 -3- Mettre dans a le caractŠre qui suit le code pris dans c On remplace ce groupe de 3 caractŠres (Code de Compression + code c + code suivant) par un groupe de (c+2) fois le caractŠre a 5.5 Recomposition du bloc 8 bits A ce stade, la taille des donn‚es doit alors etre multiple de 8. Les premiers 7/8 du bloc sont les donn‚es originale priv‚es de leur 8eme bits Les derniers 1/8 du bloc contiennent ces 8emes bits (on separe ces 2 parties) -1- On prend les 7 premiers caracteres du bloc de donn‚es 7/8 -2- On prend le premier caractere du bloc de donn‚es 1/8 les bits 6 … 0 de ce caractere sont les 8eme bits manquant du 1er..7eme caractŠre (Attention! Vous avez vu: C'est invers‚...) -3- On continue comme ca pour les 7 caracteres suivants etc..pour tout le bloc 5.6 Calcul du CRC8 -1- crc=0 puis pour chaque caractere de code ascii c -2- crc = (crc * 2) AND $7F -3- si c >= 128 alors crc = crc XOR c XOR $5A si c < 128 alors crc = crc XOR c XOR $A5 VI) GLOSSAIRE CRC:code de redondance cyclique. Verifie l'integralit‚ des donn‚es PROTOCOLE EMETTEUR: celui qui envoi le fichier PROTOCOLE RECEPTEUR: celui qui le recoit UN BIT: dans cette documentation les bits sont enonc‚s ainsi: 8eme bit = bit no 7 au cas ou c'est pas clair: un octet ou seul le 8eme bit est fix‚ vaut $80=128 FIXER UN BIT: le mettre a 1 ESC: Code ASCII 27, 1Bh VII) Codage des nombres sur plusieurs octets ex: sur 4 octets: c1 c2 c3 c4 On utilise la valeur ASCII de ces caracteres Le nombre vaut alors: c1 + c2*256 + c3*256^2 + c4*256^3 VIII) Format DOS de la date et heure de modif: NON DECRIT DANS CETTE DOCUMENTATION