IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

import de fichiers


Sujet :

Langage Perl

  1. #201
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 175
    Points : 25
    Points
    25
    Par défaut
    Il y a toujours le bon déodage dans la colonne, mais la plupart du temps les premieres lignes c'est pas ca.
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    2015/03/24 17:41:31,041,1519,B->R01,9B0280009ACE08386BC000000000
    2015/03/24 17:41:32,560,1366,R01->B,2002C0009B001FFFFFE40000000000
    2015/03/24 17:41:33,591,1472,B->R01,9F0940009B0DC8386BC0C1B430033669817492FFF0033669817493FFF0033669817491FFF000000000
    2015/03/24 17:41:33,741,1812,B->R01,880700009B1188386BC04124913FD8FFFFFF8FE2A005000A0596908000000000
    2015/03/24 17:41:35,553,1366,R01->B,180480009B43844FF627500E178FFFE41FE000000000
    2015/03/24 17:41:33,891,2162,B->R01,810F00009B1548386BC04124913FD8FFFFFF8FEBA005000A05969080B08113A3FFFF80000F0800E89780810185860687078A9495159616970C20382400000000
    2015/03/24 17:41:36,053,1366,R01->B,080380009B47444FF620004D8AA000000000
    2015/03/24 17:42:05,091,1456,B->R01,880640009E2148386BC000F4900000802F5001A003458E908000000000
    2015/03/24 17:42:05,241,1816,B->R01,8407C0009E2508386BE0007A480000401C2800D001A2C74840480B4800014000000000
    2015/03/24 17:42:07,057,1366,R01->B,214180009E572400002800007C058407FE04F6A400C8502C26741358003C6380548005C6017D000E8C01540025180F54005E30073000D460470001F8C097800471800F0009A303A20015C6003C002E8C0F5800671800F000DA300B5801DC6037F003F8C15842C800007D0279C34046C100CC0140F242821DC8C232C54061C1C061C0C19704008688C1A288405A85405A0280BC86021D03006640407143C070C780644540ADC306E0552000160040666B8010D8D801E20F001A3FFE05080A8A6ED3FFFFF0190044810A832C80A53107040532A1C60111299C051400013E7028D9009E01821AB00C0E05D20000240060C18306000B800C0190F0064229FFFE398063FFFFFFFF8000000000
    2015/03/24 17:42:08,541,1512,B->R01,920380009E7788386BC0009E570000000000
    2015/03/24 17:42:15,141,1902,B->R01,880640009F1C88386BC000F490000180245001A003454E908000000000
    2015/03/24 17:42:17,991,1546,B->R01,880600009F63C8386BC000E490000180CA5001C00385483000000000
    2015/03/24 17:42:19,537,1366,R01->B,033840009F95E4000061F016101FF812A510032140B09010152001718D02FA001D1802A8004A301EA800BC600E6001A8C08E0003F1812F0008E3001E0013460744002B8C0078005D181EB000CE3001E001B46016B003B8C06FE007F182B085900000FA028886808D8201980281E485043B9184658A80C38380C381832E08010D1183451080B50A80B40501790C043A0600CC8080E28780E18F00C88A815B860DC0AA40002C008032170021B1B003C41E00347FFC0A1015149047FFFFE0320089021503EE014A620E080A65438C022253380A280002563051B2013C030422081FF800000000
    2015/03/24 17:42:18,441,1596,B->R01,880600009F6F08386BC000E4900002803C5001A00345483000000000
    2015/03/24 17:42:20,991,1549,B->R01,920380009FAEC8386BC0009F95C000000000
    2015/03/24 17:42:22,540,1366,R01->B,180700009FE0C40000A7500E105FFFE409F0145000A00020081E0FF000000000
    2015/03/24 17:42:24,591,1446,B->R01,88060000A008C8386BC000E490000380280001A00345403000000000
    2015/03/24 17:42:26,037,1366,R01->B,033A0000A03AE40000E1F016101FF814C310032140B099D0154002518E07AA002F180398006A30238000FC604BC00238C0078004D181D1000AE3001E00174607AC00338C0078006D1805AC00EE301BF801FC604CF00428C01B0008D1802EC012E3056123200001F600C50D011B0403300503C90A08772308CB15018707018703065C10021A23068A21016A1501680A02F21808740C01990101C50F01C31E01911502B70C03DB010B6B041B811C80005C00C38736007883C009C0FF814202A2A2F8FFFFFC0640112042A03900294C41C1014CA87180444A6701450000533E0A3640278060821B03FF00000000
    2015/03/24 17:42:27,441,1599,B->R01,88060000A05008386BC000E490000480200001A00345403000000000
    2015/03/24 17:42:27,591,1939,B->R01,92038000A053C8386BC000A03AC000000000
    2015/03/24 17:42:29,530,1366,R01->B,18054000A085C4000129F01450012000000C6C0FF000000000
    2015/03/24 17:42:28,791,1742,B->R01,88060000A071C8386BC000E4900004806F0001C00385403000000000
    2015/03/24 17:42:30,533,1366,R01->B,18054000A0A3C4000129F01450012000000C6C0FF000000000
    2015/03/24 17:42:33,891,1649,B->R01,88060000A0F148386BC000E490000481960002000405203000000000
    2015/03/24 17:57:43,163,1366,R03->B,18048000F9B3C400FDE7500E105FFFE41FE000000000
    2015/03/24 17:57:40,941,2722,B->R03,810E0000F98588386BC000E49003F7819D0002000407C030B08113A3FFFF80000F0800E89780810185860687078A9495159616970C20382400000000
    2015/03/24 17:57:43,663,1366,R03->B,08038000F9B78400FDE0007CC2C000000000
    2015/03/24 17:57:44,163,1366,R03->B,180A0000F9C42400FDE0702E9000012003060C1830005C00600C878032114FFFF1CC031FFFFFFFFC00000000
    2015/03/24 17:57:42,741,1576,B->R02,88060000F9B288386BC000E49003F782370002200447C03000000000
    2015/03/24 17:57:44,317,1366,R02->B,18054000F9E48400FDE9F01450FDE000024C5E0FF000000000
    2015/03/24 17:57:42,891,1772,B->R03,88060000F9B648386BC000E49003F782440002200447C03000000000
    2015/03/24 17:57:44,817,1366,R02->B,033D4000F9F12400FDE1F01A101FF8566585FC90022000B0A390DCC1FC718F00781FCD181
    Ici je trouve dans un premier temps 81133 et dans un second temps 2747 , la vraie reponse etant 2747

  2. #202
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par mimieloic Voir le message
    Il y a toujours le bon déodage dans la colonne, mais la plupart du temps les premieres lignes c'est pas ca.
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    2015/03/24 17:41:31,041,1519,B->R01,9B0280009ACE08386BC000000000
    2015/03/24 17:41:32,560,1366,R01->B,2002C0009B001FFFFFE40000000000
    2015/03/24 17:41:33,591,1472,B->R01,9F0940009B0DC8386BC0C1B430033669817492FFF0033669817493FFF0033669817491FFF000000000
    2015/03/24 17:41:33,741,1812,B->R01,880700009B1188386BC04124913FD8FFFFFF8FE2A005000A0596908000000000
    2015/03/24 17:41:35,553,1366,R01->B,180480009B43844FF627500E178FFFE41FE000000000
    2015/03/24 17:41:33,891,2162,B->R01,810F00009B1548386BC04124913FD8FFFFFF8FEBA005000A05969080B08113A3FFFF80000F0800E89780810185860687078A9495159616970C20382400000000
    2015/03/24 17:41:36,053,1366,R01->B,080380009B47444FF620004D8AA000000000
    2015/03/24 17:42:05,091,1456,B->R01,880640009E2148386BC000F4900000802F5001A003458E908000000000
    2015/03/24 17:42:05,241,1816,B->R01,8407C0009E2508386BE0007A480000401C2800D001A2C74840480B4800014000000000
    2015/03/24 17:42:07,057,1366,R01->B,214180009E572400002800007C058407FE04F6A400C8502C26741358003C6380548005C6017D000E8C01540025180F54005E30073000D460470001F8C097800471800F0009A303A20015C6003C002E8C0F5800671800F000DA300B5801DC6037F003F8C15842C800007D0279C34046C100CC0140F242821DC8C232C54061C1C061C0C19704008688C1A288405A85405A0280BC86021D03006640407143C070C780644540ADC306E0552000160040666B8010D8D801E20F001A3FFE05080A8A6ED3FFFFF0190044810A832C80A53107040532A1C60111299C051400013E7028D9009E01821AB00C0E05D20000240060C18306000B800C0190F0064229FFFE398063FFFFFFFF8000000000
    2015/03/24 17:42:08,541,1512,B->R01,920380009E7788386BC0009E570000000000
    2015/03/24 17:42:15,141,1902,B->R01,880640009F1C88386BC000F490000180245001A003454E908000000000
    2015/03/24 17:42:17,991,1546,B->R01,880600009F63C8386BC000E490000180CA5001C00385483000000000
    2015/03/24 17:42:19,537,1366,R01->B,033840009F95E4000061F016101FF812A510032140B09010152001718D02FA001D1802A8004A301EA800BC600E6001A8C08E0003F1812F0008E3001E0013460744002B8C0078005D181EB000CE3001E001B46016B003B8C06FE007F182B085900000FA028886808D8201980281E485043B9184658A80C38380C381832E08010D1183451080B50A80B40501790C043A0600CC8080E28780E18F00C88A815B860DC0AA40002C008032170021B1B003C41E00347FFC0A1015149047FFFFE0320089021503EE014A620E080A65438C022253380A280002563051B2013C030422081FF800000000
    2015/03/24 17:42:18,441,1596,B->R01,880600009F6F08386BC000E4900002803C5001A00345483000000000
    2015/03/24 17:42:20,991,1549,B->R01,920380009FAEC8386BC0009F95C000000000
    2015/03/24 17:42:22,540,1366,R01->B,180700009FE0C40000A7500E105FFFE409F0145000A00020081E0FF000000000
    2015/03/24 17:42:24,591,1446,B->R01,88060000A008C8386BC000E490000380280001A00345403000000000
    2015/03/24 17:42:26,037,1366,R01->B,033A0000A03AE40000E1F016101FF814C310032140B099D0154002518E07AA002F180398006A30238000FC604BC00238C0078004D181D1000AE3001E00174607AC00338C0078006D1805AC00EE301BF801FC604CF00428C01B0008D1802EC012E3056123200001F600C50D011B0403300503C90A08772308CB15018707018703065C10021A23068A21016A1501680A02F21808740C01990101C50F01C31E01911502B70C03DB010B6B041B811C80005C00C38736007883C009C0FF814202A2A2F8FFFFFC0640112042A03900294C41C1014CA87180444A6701450000533E0A3640278060821B03FF00000000
    2015/03/24 17:42:27,441,1599,B->R01,88060000A05008386BC000E490000480200001A00345403000000000
    2015/03/24 17:42:27,591,1939,B->R01,92038000A053C8386BC000A03AC000000000
    2015/03/24 17:42:29,530,1366,R01->B,18054000A085C4000129F01450012000000C6C0FF000000000
    2015/03/24 17:42:28,791,1742,B->R01,88060000A071C8386BC000E4900004806F0001C00385403000000000
    2015/03/24 17:42:30,533,1366,R01->B,18054000A0A3C4000129F01450012000000C6C0FF000000000
    2015/03/24 17:42:33,891,1649,B->R01,88060000A0F148386BC000E490000481960002000405203000000000
    2015/03/24 17:57:43,163,1366,R03->B,18048000F9B3C400FDE7500E105FFFE41FE000000000
    2015/03/24 17:57:40,941,2722,B->R03,810E0000F98588386BC000E49003F7819D0002000407C030B08113A3FFFF80000F0800E89780810185860687078A9495159616970C20382400000000
    2015/03/24 17:57:43,663,1366,R03->B,08038000F9B78400FDE0007CC2C000000000
    2015/03/24 17:57:44,163,1366,R03->B,180A0000F9C42400FDE0702E9000012003060C1830005C00600C878032114FFFF1CC031FFFFFFFFC00000000
    2015/03/24 17:57:42,741,1576,B->R02,88060000F9B288386BC000E49003F782370002200447C03000000000
    2015/03/24 17:57:44,317,1366,R02->B,18054000F9E48400FDE9F01450FDE000024C5E0FF000000000
    2015/03/24 17:57:42,891,1772,B->R03,88060000F9B648386BC000E49003F782440002200447C03000000000
    2015/03/24 17:57:44,817,1366,R02->B,033D4000F9F12400FDE1F01A101FF8566585FC90022000B0A390DCC1FC718F00781FCD181
    Ici je trouve dans un premier temps 81133 et dans un second temps 2747 , la vraie reponse etant 2747
    Tu ne réponds toujours pas à ma question, donc le script ne change pas de fonctionnement, et tu n'as pas ce que tu veux.

    Tu dis que "une seule ligne 81 te suffit"... MAIS LAQUELLE CHOISIR QUAND IL Y EN A PLUSIEURS (ici, dans cet exemple précis, il y a une ligne 81 en ligne 6 qui est décodé 81133 et une deuxième ligne 81 en ligne 27 avec un autre décodage, 2747

    TU DOIS ABSOLUMENT INDIQUER QUEL LIGNE 81 il faut prendre en compte pour le décodage pour les cas de fichiers où il y a plusieurs lignes 81 avec des décodages différents. Je ne peux rien faire de plus sur le script sans que tu ais répondu à cette question.

    D'ailleurs, le script te le dit dans les messages affichés à l'écran :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Line to decode found at 6 in in3.txt
    New line to decode at 27 in in3.txt
    -> new decoded value is different from first occurence: old = 81133, new = 2747
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  3. #203
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 175
    Points : 25
    Points
    25
    Par défaut
    Normalement ca donne la meme chose (ce qui devrait se passer )
    mais pour etre sur : peut on faire -> prendre la valeur de la derniere ligne 81 et l'affecter partout , de la premiere ligne 88 à la derniere?

  4. #204
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par mimieloic Voir le message
    Normalement ca donne la meme chose (ce qui devrait se passer )
    Tu veux dire que :
    - le script se trompe ?
    - ou que le fichier contient des valeurs incorrectes ?
    mais pour etre sur : peut on faire -> prendre la valeur de la derniere ligne 81 et l'affecter partout , de la premiere ligne 88 à la derniere?
    Oui on peut, et ça fait partie des propositions de solutions que je t'avais faites.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  5. #205
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 175
    Points : 25
    Points
    25
    Par défaut
    J'ai trouvé le problème, ca marchait dans un cas par chance, mais en fait il manque une étape de décodage, cf mon premier pdf
    quand il y a écrit : "au 186e" au 201e etc
    si le bit 186 =1 alors prendre les 32 bits à partir du bit 215 (premier bit le 216 , 217 etc etc )
    s le bit 186 est différent de 1 alors prendre les 32 bits à partir du bit 207
    Nouveau Document Microsoft Word.docx

    Donc ca marchait dans certains cas, car les memes bits mais par chance en effet

  6. #206
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Dans ton nouveau doc de specification, le test du bit 186 est fait avec "001" donc sur 3 bits, et les autres avec "1" donc sur 1 bit. Soit bien précis dans ce que tu expliques, car là, j'ai un doute sur ce que tu veux réellement faire !
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  7. #207
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Pour le décalage de bits, dans ta première spécification, ici, tu avais écris pour les différents cas, les bits 218, 210, 233, 225, 242, 233, 255, 247
    Là, c'est un peu différent ! (décalage de 1 à 3 bits).

    Tu confirmes bien les nouvelles valeurs ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  8. #208
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 175
    Points : 25
    Points
    25
    Par défaut
    1 pardon, enfait c'est une trois bits mais vu que ma valeur a vérifié est 1 alors je vérifie que le dernier bit.
    Mais cest bête en fait!
    Vous avez raison !!!!
    il faut vérifier les 3 bits car si j'ai 111 c'est différent de 001 et pourtant j'accepte donc je réécris la dernière ligne ici dans l'ordre:
    si bits 184 à 186 = 001 -> 215
    si bits 184à 186 else -> 207
    si bits 199à201 =001 -> 230
    si bits 199 à 200 else -> 222

    si bits 208 à 210

    et si bits 223 à 225
    les valeurs de la dernire ligne sont bonnes, jsute les valeurs du debut des bits à changer

  9. #209
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 175
    Points : 25
    Points
    25
    Par défaut
    oui normalement j'ai bien compté :S

  10. #210
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Tes explications sont de moins en moins claires : initialement, quand je testais "au 186e bit si j'ai 001" les bits testés étaient le bit 186, 187 et 188. Et là, tu me parles des bits 184 à 186

    Par ailleurs, quand tu écris "le bit 10", dans le tableau de bit suivant, ça correspond à quel lettre ?
    A B C D E F G H I J K L M N O P
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  11. #211
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 175
    Points : 25
    Points
    25
    Par défaut
    oui oui mais j'avais décalé ...
    pour le 186 je mettias expliquer la dernière fois en fait, je voulais mettre jsute 1 sur 186 mais ca marche pas , les valeurs que j'ai dis aujourdhui sont justes.

    le bit 10 correspond à quelle lettre?

  12. #212
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    J'ai fait des essais, et si le résultat du décodage des lignes 81 du dernier fichier de test est 2747, alors les indices des 32 bits du code sont bien ceux que tu avais donnés à l'origine (216e, 210e, ...).
    Le simple fait de tester 3 bits au lieu d'un seul à partir du bit 186 (donc bits 186 à 188) donne le même résultat de 2747 pour toutes les lignes 81.

    Voici le script, teste le sur plusieurs fichiers, et répond à la question du bit 10 (chaque lettre dans le tableau correspond à 1 bit).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use feature qw(:5.14);
    use File::Copy;
     
    # Le fichier résultat sera la sortie standard : utiliser > un_fichier.txt pour le stocker
    # sauf si l'option -e=<extension> est utilisée. Dans ce cas, un fichier avec l'extension
    # est créé, et une commande matlab est exécutée
     
    # Récupération des paramètres d'appel du script (on affecte au tableau @in, le tableau @ARGV)
    my @in = @ARGV;
    @in = map /[\*\?]/ ? glob($_) : $_, @in;
     
    my ($file_ext) = map /^-e=(.*)$/, @in;
    @in = grep !/^-[e]/, @in;
    if (my @unknown_options = grep /^-/, @in) {
      die "Unknown option(s): @unknown_options";
    }
     
    warn "Files will be treated one by one, each output file will be of the form <input_file>.$file_ext\n"
      if $file_ext;
     
    # Pour tous les fichier en entrée
    sub decode81($$);
    sub decode88($;$);
    foreach my $in (@in) {
      warn "Treating $in...\n";
     
      # Ouvrir le fichier d'entrée en lecture
      open my $IN, "<", $in or die "Can't open file $in for reading: $!";
     
      # Ouvrir un fichier de sortie en écriture (si option -ext=<extension>)
      my $out = "$in.$file_ext" if $file_ext;
      open my $OUT, ">", $out or die "Can't open file $out for writing: $!"
        if $out;
     
      # Déclarer un tableau pour les lignes 88 lues avant la ligne 81
      # et un scalaire pour le code décimal
      my (@kept_lines, $decoded);
     
      # Boucler sur toutes les lignes du fichier ouvert en entrée
      while (my $line = <$IN>) {
        # Supprimer les caractères de fin de ligne (mettre à jour la variable
        # $/ s'il ne s'agit pas de \n)
        chomp($line);
     
        # Récupération du timestamp et du code hexa de la ligne
        my ($timestamp, $code) = $line =~ /(.*?,).*,([\da-f]+)$/i;
     
        # Passer à la ligne suivante si le code n'est ni 81 ni 88
        next if !$code || $code !~ /^8[18]/;
     
        if ($code =~ /^81/) {
          # Si l'on a déjà décodé un code, le signaler, sinon simplement
          # indiquer que l'on décode
          warn "Line to decode found at $. in $in\n" if !$decoded;
          warn "New line to decode at $. in $in\n" if $decoded;
     
          # Sauvegarde de l'éventuel code décimal actuellement déjà décodé
          my $old_decoded = $decoded if $decoded;
     
          $decoded = decode81($code, $old_decoded);
     
          # Si l'on a stocké des lignes 88 précédent cette ligne 81, les traiter en ajoutant le code décimal
          if (@kept_lines) {
            map { say { $OUT // *STDOUT } sprintf $_, $decoded } splice @kept_lines;
          }
        }
        # Si la ligne n'est pas une 81 (c'est donc forcément une 88)
        else {
          # Décoder la ligne 88
          if ($code = decode88($code, $decoded)) {
            # Si  le code décimal a été décodé
            # traiter la ligne en ajoutant le code décimal au timestamp et au code hexa
            if ($decoded) {
              say { $OUT // *STDOUT } "$timestamp$code";
            }
            # Si la ligne n'est pas une 81 et que le code n'est pas décodé, enregistrer la ligne (timestamp et code hexa) pour un traitement
            # ultérieur (lors du traitement de la ligne 81 ; le code de la ligne n'étant pas encore connu, il est remplacé par %s qui servira de template pour sprintf)
            else {
              push @kept_lines, "$timestamp$code";
            }
          }
        }
      }
     
      undef $OUT;
      if ($out) {
        # Si l'option -e a été fournie, il faut appeler matlab avec le fichier $out renommé en "fichier.csv"
        # Ici, on fait une copie pour garder le fichier $out intermédiaire (on peut utiliser rename à la place)
        copy $out, "fichier.csv" or die "Can't create fichier.csv";
     
        # On appelle Matlab
        system("echo matlab -wait -r programme");
     
        # On renomme le résultat "fichier.xls" produit par Matlab en "$in.xls".
        # On ajoute simplement l'extension .xls au fichier d'entrée, c'est une mesure simplificatrice.
        # On aurait aussi pu modifier l'extension du fichier d'entrée (rename "fichier.xls", $in =~ s/\.([^\.]+)$/.xls/r)
        rename "fichier.xls", "$in.xls";
      }
    }
     
    sub bin2hex($;$$) {
      my ($bitcode, $group, $msb_first) = @_;
     
      # Si $group est défini, on regroupe les bits par paquets de $group et on traite les groupes comme des digits décimaux limités à 9
      # Si $group non défini, pas de regroupement, on traite la chaine de bit en un morceau)
      # Par défaut, MSB first
      $msb_first //= 1;
     
      # La construction suit plusieurs étapes (pipeline de fonction à lire de droite à gauche) :
      # 1- substr($bitcode, $bitpos, 32) =~ /(.{$group})/g : récupère le code binaire ASCII de 32 à la position $bitpos
      #                                                      et en extrait un tableau de chaines de $group digit binaires
      #                                                      grâce à une recherche d'expression régulière globale
      # 2- map oct("0b$_") : pour chaque chaine binaire de 4 digits, convertir le code binaire ASCII en valeur numérique
      # 3- grep $_ < 10    : pour chaque valeur numérique, ne conserver que les valeurs inférieures à 10
      # 4- dans le cas LSB first, inverser les bits
      # 5- join ""         : concaténer sous forme "chaine" les digits décimaux ($decoded est alors une chaine
      #                      mais qui peut être utilisée dans un contexte numérique comme une valeur numérique)
      my @bits = $group ? grep $_ < 10, map oct("0b$_"), $bitcode =~ /(.{$group})/g : oct("0b$bitcode");
      map reverse, @bits if !$msb_first;
      return join "", @bits;
    }
     
    sub decode81($$) {
      my ($code, $old_decoded) = @_;
     
      # Convertir le code hexa en binaire
      # La transformation s'opère en deux temps :
      # pack("H*", $code) code en "binaire" le code hexa récupéré sous forme ASCII
      # puis unpack("B*", ...) décode le "binaire" en code binaire sous forme ASCII
      # "binaire" signifiant ici de vrai binaire numérique (comme il est stocké dans un entier numérique).
      # Les formats majuscules imposent un sens de code hexa et binaire "MSB" first (bit de poids fort en premier)
      my $bitcode = unpack("B*", pack("H*", $code));
      my $bit75 = substr($bitcode, 74, 8);
     
      # Déclaration d'une variable qui contiendra la position des 32bits à décoder
      my $bitpos;
      if ($bit75 eq "00000000") {
        my $bit171 = substr($bitcode, 170, 2);
        if ($bit171 eq "00" || $bit171 eq "11") {
          $bitpos = substr($bitcode, 185, 3) eq "001" ? 217 : 209;
        }
        else {
          $bitpos = substr($bitcode, 200, 3) eq "001" ? 232 : 224;
        }
      }
      elsif ($bit75 eq "00000001") {
        my $bit194 = substr($bitcode, 193, 2);
        if ($bit194 eq "00" || $bit194 eq "11") {
          $bitpos = substr($bitcode, 209, 3) eq "001" ? 241 : 232;
        }
        else {
          $bitpos = substr($bitcode, 222, 3) eq "001" ? 254 : 246;
        }
      }
     
      # Construction du code décimal
      my $decoded = bin2hex(substr($bitcode, $bitpos, 32), 4) if $bitpos;
     
      # Trivial
      if ($old_decoded) {
        if ($decoded != $old_decoded) {
          warn "-> new decoded value is different from first occurence: old = $old_decoded, new = $decoded\n";
        }
        else {
          warn "-> same value ($decoded == $old_decoded)\n";
        }
      }
     
      return $decoded;
    }
     
    sub decode88($;$) {
      my ($code, $code81) = @_;
     
      my $decoded = $code;
     
      # Si le code de la ligne 81 n'est pas encore connu, il est remplacé par %s qui servira de template pour sprintf
      $code81 //= "%s";
      my @decoded = ($code81);
     
      # Convertir le code hexa en binaire
      my $bitcode = unpack("B*", pack("H*", $code));
      my $bit75 = substr($bitcode, 74, 8);
     
      # Déclaration d'une variable qui contiendra la position des 32bits à décoder
      my $bitpos;
      if ($bit75 eq "00000000") {
        my $bit171 = substr($bitcode, 170, 2);
        if ($bit171 eq "00" || $bit171 eq "11") {
          # Test du bit 186
          if (substr($bitcode, 185, 3) ne "011") {
            $decoded = undef;
          }
        }
        else {
          # test du bit 201
          if (substr($bitcode, 200, 3) ne "011") {
            $decoded = undef;
          }
        }
      }
      elsif ($bit75 eq "00000001") {
        my $bit195 = substr($bitcode, 194, 2);
        if ($bit195 eq "00" || $bit195 eq "11") {
          # Test du bit 210
          if (substr($bitcode, 209, 3) ne "011") {
            $decoded = undef;
          }
        }
        else {
          # test du bit 225
          if (substr($bitcode, 224, 3) ne "011") {
            $decoded = undef;
          }
        }
      }
     
      if ($decoded) {
        # Decoder les bit 51 à 74
        push @decoded, bin2hex(substr($bitcode, 50, 74-50), undef, 0);
     
        # Decoder les bits 108 à 122
        push @decoded, bin2hex(substr($bitcode, 107, 122-107), undef, 0);
     
        # Test du bit 82 pour décodage dernière colonne
        my $bit82    = substr($bitcode, 81, 1);
        my $last_col = bin2hex(substr($bitcode, $bit82 eq "0" ? 122 : 146, $bit82 eq "0" ? 138-122 : 162-146), undef, 0);
     
        # Decodage du multiplicateur
        my $bit96 = substr($bitcode, 95, 2);
        my $multi = $bit96 eq "00" || $bit96 eq "10" ? 10 : $bit96 eq "01" ? 1 : undef;
        my $last_col_unit = $bit96 eq "00" ? "cm" : $bit96 eq "01" || $bit96 eq "10" ? "m" : "";
        push @decoded, ($last_col * $multi).$last_col_unit if $multi;
     
        $decoded = join "\t", $code, @decoded;
      }
     
      return $decoded;
    }
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  13. #213
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 175
    Points : 25
    Points
    25
    Par défaut
    par exemple ce fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    2014/12/16 09:20:19,327,2253,B->R01,810F0001216508386D004124913FD8FFFFFF8EBEA0046008C3F69080B0814AA9FFFF80000F0800E89780810185860687078A9495159616970C20382400000000
    cette ligne me donne 70 alors que je veux 9553
    le bit 10 correspond pas une lettre , je comrpends pas la question

    Peut on rajouter quand meme dans le programme la , le fait que l'on prenne que la dernière ligne 81 aux lignes 88.
    je dois verifier les bits à tete reposée.

  14. #214
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Voici le version qui retient le dernier décodage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use feature qw(:5.14);
    use File::Copy;
     
    # Le fichier résultat sera la sortie standard : utiliser > un_fichier.txt pour le stocker
    # sauf si l'option -e=<extension> est utilisée. Dans ce cas, un fichier avec l'extension
    # est créé, et une commande matlab est exécutée
     
    # Récupération des paramètres d'appel du script (on affecte au tableau @in, le tableau @ARGV)
    my @in = @ARGV;
    @in = map /[\*\?]/ ? glob($_) : $_, @in;
     
    my ($file_ext) = map /^-e=(.*)$/, @in;
    @in = grep !/^-[e]/, @in;
    if (my @unknown_options = grep /^-/, @in) {
      die "Unknown option(s): @unknown_options";
    }
     
    warn "Files will be treated one by one, each output file will be of the form <input_file>.$file_ext\n"
      if $file_ext;
     
    # Pour tous les fichier en entrée
    sub decode81($$);
    sub decode88($;$);
    foreach my $in (@in) {
      warn "Treating $in...\n";
     
      # Ouvrir le fichier d'entrée en lecture
      open my $IN, "<", $in or die "Can't open file $in for reading: $!";
     
      # Ouvrir un fichier de sortie en écriture (si option -ext=<extension>)
      my $out = "$in.$file_ext" if $file_ext;
      open my $OUT, ">", $out or die "Can't open file $out for writing: $!"
        if $out;
     
      # Déclarer un tableau pour les lignes 88 lues avant la ligne 81
      # et un scalaire pour le code décimal
      my (@kept_lines, $decoded);
     
      # Boucler sur toutes les lignes du fichier ouvert en entrée
      while (my $line = <$IN>) {
        # Supprimer les caractères de fin de ligne (mettre à jour la variable
        # $/ s'il ne s'agit pas de \n)
        chomp($line);
     
        # Récupération du timestamp et du code hexa de la ligne
        my ($timestamp, $code) = $line =~ /(.*?,).*,([\da-f]+)$/i;
     
        # Passer à la ligne suivante si le code n'est ni 81 ni 88
        next if !$code || $code !~ /^8[18]/;
     
        if ($code =~ /^81/) {
          # Si l'on a déjà décodé un code, le signaler, sinon simplement
          # indiquer que l'on décode
          warn "Line to decode found at $. in $in\n" if !$decoded;
          warn "New line to decode at $. in $in\n" if $decoded;
     
          # Sauvegarde de l'éventuel code décimal actuellement déjà décodé
          my $old_decoded = $decoded if $decoded;
     
          $decoded = decode81($code, $old_decoded);
          warn "Code : \n", $decoded;
        }
        # Si la ligne n'est pas une 81 (c'est donc forcément une 88)
        else {
          # Décoder la ligne 88
          if ($code = decode88($code)) {
            # Si la ligne n'est pas une 81, enregistrer la ligne (timestamp et code hexa) pour un
            # traitement en fin de lecture, avec la dernière valeur du code 81
            push @kept_lines, "$timestamp$code";
          }
        }
      }
     
      # Si l'on a stocké des lignes 88 et qu'un code 81 a été décodé, les traiter en ajoutant le code décimal
      if ($decoded && @kept_lines) {
        map { say { $OUT // *STDOUT } sprintf $_, $decoded } splice @kept_lines;
      }
     
      undef $OUT;
      if ($out) {
        # Si l'option -e a été fournie, il faut appeler matlab avec le fichier $out renommé en "fichier.csv"
        # Ici, on fait une copie pour garder le fichier $out intermédiaire (on peut utiliser rename à la place)
        copy $out, "fichier.csv" or die "Can't create fichier.csv";
     
        # On appelle Matlab
        system("echo matlab -wait -r programme");
     
        # On renomme le résultat "fichier.xls" produit par Matlab en "$in.xls".
        # On ajoute simplement l'extension .xls au fichier d'entrée, c'est une mesure simplificatrice.
        # On aurait aussi pu modifier l'extension du fichier d'entrée (rename "fichier.xls", $in =~ s/\.([^\.]+)$/.xls/r)
        rename "fichier.xls", "$in.xls";
      }
    }
     
    sub bin2hex($;$$) {
      my ($bitcode, $group, $msb_first) = @_;
     
      # Si $group est défini, on regroupe les bits par paquets de $group et on traite les groupes comme des digits décimaux limités à 9
      # Si $group non défini, pas de regroupement, on traite la chaine de bit en un morceau)
      # Par défaut, MSB first
      $msb_first //= 1;
     
      # La construction suit plusieurs étapes (pipeline de fonction à lire de droite à gauche) :
      # 1- substr($bitcode, $bitpos, 32) =~ /(.{$group})/g : récupère le code binaire ASCII de 32 à la position $bitpos
      #                                                      et en extrait un tableau de chaines de $group digit binaires
      #                                                      grâce à une recherche d'expression régulière globale
      # 2- map oct("0b$_") : pour chaque chaine binaire de 4 digits, convertir le code binaire ASCII en valeur numérique
      # 3- grep $_ < 10    : pour chaque valeur numérique, ne conserver que les valeurs inférieures à 10
      # 4- dans le cas LSB first, inverser les bits
      # 5- join ""         : concaténer sous forme "chaine" les digits décimaux ($decoded est alors une chaine
      #                      mais qui peut être utilisée dans un contexte numérique comme une valeur numérique)
      my @bits = $group ? grep $_ < 10, map oct("0b$_"), $bitcode =~ /(.{$group})/g : oct("0b$bitcode");
      map reverse, @bits if !$msb_first;
      return join "", @bits;
    }
     
    sub decode81($$) {
      my ($code, $old_decoded) = @_;
     
      # Convertir le code hexa en binaire
      # La transformation s'opère en deux temps :
      # pack("H*", $code) code en "binaire" le code hexa récupéré sous forme ASCII
      # puis unpack("B*", ...) décode le "binaire" en code binaire sous forme ASCII
      # "binaire" signifiant ici de vrai binaire numérique (comme il est stocké dans un entier numérique).
      # Les formats majuscules imposent un sens de code hexa et binaire "MSB" first (bit de poids fort en premier)
      my $bitcode = unpack("B*", pack("H*", $code));
      my $bit75 = substr($bitcode, 74, 8);
     
      # Déclaration d'une variable qui contiendra la position des 32bits à décoder
      my $bitpos;
      if ($bit75 eq "00000000") {
        my $bit171 = substr($bitcode, 170, 2);
        if ($bit171 eq "00" || $bit171 eq "11") {
          $bitpos = substr($bitcode, 185, 3) eq "001" ? 217 : 209;
        }
        else {
          $bitpos = substr($bitcode, 200, 3) eq "001" ? 232 : 224;
        }
      }
      elsif ($bit75 eq "00000001") {
        my $bit194 = substr($bitcode, 193, 2);
        if ($bit194 eq "00" || $bit194 eq "11") {
          $bitpos = substr($bitcode, 209, 3) eq "001" ? 241 : 232;
        }
        else {
          $bitpos = substr($bitcode, 222, 3) eq "001" ? 254 : 246;
        }
      }
     
      # Construction du code décimal
      my $decoded = bin2hex(substr($bitcode, $bitpos, 32), 4) if $bitpos;
     
      # Trivial
      if ($old_decoded) {
        if ($decoded != $old_decoded) {
          warn "-> new decoded value is different from first occurence: old = $old_decoded, new = $decoded\n";
        }
        else {
          warn "-> same value ($decoded == $old_decoded)\n";
        }
      }
     
      return $decoded;
    }
     
    sub decode88($;$) {
      my ($code, $code81) = @_;
     
      my $decoded = $code;
     
      # Si le code de la ligne 81 n'est pas encore connu, il est remplacé par %s qui servira de template pour sprintf
      $code81 //= "%s";
      my @decoded = ($code81);
     
      # Convertir le code hexa en binaire
      my $bitcode = unpack("B*", pack("H*", $code));
      my $bit75 = substr($bitcode, 74, 8);
     
      # Déclaration d'une variable qui contiendra la position des 32bits à décoder
      my $bitpos;
      if ($bit75 eq "00000000") {
        my $bit171 = substr($bitcode, 170, 2);
        if ($bit171 eq "00" || $bit171 eq "11") {
          # Test du bit 186
          if (substr($bitcode, 185, 3) ne "011") {
            $decoded = undef;
          }
        }
        else {
          # test du bit 201
          if (substr($bitcode, 200, 3) ne "011") {
            $decoded = undef;
          }
        }
      }
      elsif ($bit75 eq "00000001") {
        my $bit195 = substr($bitcode, 194, 2);
        if ($bit195 eq "00" || $bit195 eq "11") {
          # Test du bit 210
          if (substr($bitcode, 209, 3) ne "011") {
            $decoded = undef;
          }
        }
        else {
          # test du bit 225
          if (substr($bitcode, 224, 3) ne "011") {
            $decoded = undef;
          }
        }
      }
     
      if ($decoded) {
        # Decoder les bit 51 à 74
        push @decoded, bin2hex(substr($bitcode, 50, 74-50), undef, 0);
     
        # Decoder les bits 108 à 122
        push @decoded, bin2hex(substr($bitcode, 107, 122-107), undef, 0);
     
        # Test du bit 82 pour décodage dernière colonne
        my $bit82    = substr($bitcode, 81, 1);
        my $last_col = bin2hex(substr($bitcode, $bit82 eq "0" ? 122 : 146, $bit82 eq "0" ? 138-122 : 162-146), undef, 0);
     
        # Decodage du multiplicateur
        my $bit96 = substr($bitcode, 95, 2);
        my $multi = $bit96 eq "00" || $bit96 eq "10" ? 10 : $bit96 eq "01" ? 1 : undef;
        my $last_col_unit = $bit96 eq "00" ? "cm" : $bit96 eq "01" || $bit96 eq "10" ? "m" : "";
        push @decoded, ($last_col * $multi).$last_col_unit if $multi;
     
        $decoded = join "\t", $code, @decoded;
      }
     
      return $decoded;
    }
    Mais cette version du script ne retourne pas 9553 pour ton dernier exemple.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  15. #215
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Tes explications sont de moins en moins claires : initialement, quand je testais "au 186e bit si j'ai 001" les bits testés étaient le bit 186, 187 et 188. Et là, tu me parles des bits 184 à 186

    Par ailleurs, quand tu écris "le bit 10", dans le tableau de bit suivant, ça correspond à quel lettre ?
    A B C D E F G H I J K L M N O P
    Je vais reformuler dans le mot de 16 bits ci-dessous, quel lettre se trouve en face du bit 10 (et quelle est sa valeur 0 ou 1 ?) ?

    0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
    A B C D E F G H I J K L M N O P
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  16. #216
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 175
    Points : 25
    Points
    25
    Par défaut
    K et du coup 0 , je dirais

  17. #217
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Perso, c'est le 10e bit ... as-tu bien compté ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  18. #218
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 175
    Points : 25
    Points
    25
    Par défaut
    ah oui j'ai dis le 10e bit, mais je comprends pas 10 c'est A . sinon je comprends toujorus pas la question :S
    Sinon j'ai adapté un ou deux chiffres, et je trouve toujorus le bon codage, merci infiniement

  19. #219
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par mimieloic Voir le message
    ah oui j'ai dis le 10e bit, mais je comprends pas 10 c'est A . sinon je comprends toujorus pas la question :S
    La question est simple, je cherche à savoir où tu positionnes le bit 10 (car depuis le début, tu n'as jamais répondu clairement). En informatique, les indices de tableau commencent souvent à 0, et pour compter les bits, on utilise aussi parfois bit0, bit1, bit2... Le 10e bit pourrait donc correspondre à bit9. J'essaye de savoir ce que tu entends réellement entre 10e bit.
    Les lettres, ce n'est pas une codage... c'est juste une repère pour savoir QUEL est le 10e bit pour toi (j'aurais pu mettre des dessins dans les cases à la place des lettres, un lapin, une souris, un chien, un avion, une maison, ...).

    Si tu as résolu, c'est tant mieux. Par contre, je t'invite à poster les corrections au cas où tu aurais d'autres questions par la suite.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  20. #220
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 175
    Points : 25
    Points
    25
    Par défaut
    non il y a pas de bit0 pour moi, mon dernier programme est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use feature qw(:5.14);
    use File::Copy;
     
    # Le fichier résultat sera la sortie standard : utiliser > un_fichier.txt pour le stocker
    # sauf si l'option -e=<extension> est utilisée. Dans ce cas, un fichier avec l'extension
    # est créé, et une commande matlab est exécutée
     
    # Récupération des paramètres d'appel du script (on affecte au tableau @in, le tableau @ARGV)
    my @in = @ARGV;
    @in = map /[\*\?]/ ? glob($_) : $_, @in;
     
    my ($file_ext) = map /^-e=(.*)$/, @in;
    @in = grep !/^-[e]/, @in;
    if (my @unknown_options = grep /^-/, @in) {
      die "Unknown option(s): @unknown_options";
    }
     
    warn "Files will be treated one by one, each output file will be of the form <input_file>.$file_ext"
      if $file_ext;
     
    # Pour tous les fichier en entrée
    sub decode81($$);
    sub decode88($;$);
    foreach my $in (@in) {
      warn "Treating $in...\n";
     
      # Ouvrir le fichier d'entrée en lecture
      open my $IN, "<", $in or die "Can't open file $in for reading: $!";
     
      # Ouvrir un fichier de sortie en écriture (si option -ext=<extension>)
      my $out = "$in.$file_ext" if $file_ext;
      open my $OUT, ">", $out or die "Can't open file $out for writing: $!"
        if $out;
     
      # Déclarer un tableau pour les lignes 88 lues avant la ligne 81
      # et un scalaire pour le code décimal
      my (@kept_lines, $decoded);
     
      # Boucler sur toutes les lignes du fichier ouvert en entrée
      while (my $line = <$IN>) {
        # Supprimer les caractères de fin de ligne (mettre à jour la variable
        # $/ s'il ne s'agit pas de \n)
        chomp($line);
     
        # Récupération du timestamp et du code hexa de la ligne
        my ($timestamp, $code) = $line =~ /(.*?),.*,([\da-f]+)$/i;
     
        # Passer à la ligne suivante si le code n'est ni 81 ni 88
        next if !$code || $code !~ /^8[18]/;
     
        if ($code =~ /^81/) {
          # Si l'on a déjà décodé un code, le signaler, sinon simplement
          # indiquer que l'on décode
          warn "Line to decode found at $. in $in\n" if !$decoded;
          warn "New line to decode at $. in $in\n" if $decoded;
     
          # Sauvegarde de l'éventuel code décimal actuellement déjà décodé
          my $old_decoded = $decoded if $decoded;
     
          $decoded = decode81($code, $old_decoded);
     
          # Si l'on a stocké des lignes 88 précédent cette ligne 81, les traiter en ajoutant le code décimal
          if (@kept_lines) {
            map { say { $OUT // *STDOUT } sprintf $_, $decoded } splice @kept_lines;
          }
        }
        # Si la ligne n'est pas une 81 (c'est donc forcément une 88)
        else {
          # Décoder la ligne 88
          if ($code = decode88($code, $decoded)) {
            # Si  le code décimal a été décodé
            # traiter la ligne en ajoutant le code décimal au timestamp et au code hexa
            if ($decoded) {
              say { $OUT // *STDOUT } "$timestamp;$code";
            }
            # Si la ligne n'est pas une 81 et que le code n'est pas décodé, enregistrer la ligne (timestamp et code hexa) pour un traitement
            # ultérieur (lors du traitement de la ligne 81 ; le code de la ligne n'étant pas encore connu, il est remplacé par %s qui servira de template pour sprintf)
            else {
              push @kept_lines, "$timestamp;$code";
            }
          }
        }
      }
     
      undef $OUT;
      if ($out) {
        # Si l'option -e a été fournie, il faut appeler matlab avec le fichier $out renommé en "fichier.csv"
        # Ici, on fait une copie pour garder le fichier $out intermédiaire (on peut utiliser rename à la place)
        rename $out, "fichier.csv" or die "Can't create fichier.csv";
     
        # On appelle Matlab
        system("matlab -wait -r programme");
     
        # On renomme le résultat "fichier.xls" produit par Matlab en "$in.xls".
        # On ajoute simplement l'extension .xls au fichier d'entrée, c'est une mesure simplificatrice.
        # On aurait aussi pu modifier l'extension du fichier d'entrée (rename "fichier.xls", $in =~ s/\.([^\.]+)$/.xls/r)
        my $out = $in;
        $out =~ s/.eur/.xls/;
        rename "fichier.xls", "$out";
      }
    }
     
    sub bin2hex($;$$) {
      my ($bitcode, $group, $msb_first) = @_;
     
      # Si $group est défini, on regroupe les bits par paquets de $group et on traite les groupes comme des digits décimaux limités à 9
      # Si $group non défini, pas de regroupement, on traite la chaine de bit en un morceau)
      # Par défaut, MSB first
      $msb_first //= 1;
     
      # La construction suit plusieurs étapes (pipeline de fonction à lire de droite à gauche) :
      # 1- substr($bitcode, $bitpos, 32) =~ /(.{$group})/g : récupère le code binaire ASCII de 32 à la position $bitpos
      #                                                      et en extrait un tableau de chaines de $group digit binaires
      #                                                      grâce à une recherche d'expression régulière globale
      # 2- map oct("0b$_") : pour chaque chaine binaire de 4 digits, convertir le code binaire ASCII en valeur numérique
      # 3- grep $_ < 10    : pour chaque valeur numérique, ne conserver que les valeurs inférieures à 10
      # 4- dans le cas LSB first, inverser les bits
      # 5- join ""         : concaténer sous forme "chaine" les digits décimaux ($decoded est alors une chaine
      #                      mais qui peut être utilisée dans un contexte numérique comme une valeur numérique)
      my @bits = $group ? grep $_ < 10, map oct("0b$_"), $bitcode =~ /(.{$group})/g : oct("0b$bitcode");
      map reverse, @bits if !$msb_first;
      return join "", @bits;
    }
     
    sub decode81($$) {
      my ($code, $old_decoded) = @_;
     
      # Convertir le code hexa en binaire
      # La transformation s'opère en deux temps :
      # pack("H*", $code) code en "binaire" le code hexa récupéré sous forme ASCII
      # puis unpack("B*", ...) décode le "binaire" en code binaire sous forme ASCII
      # "binaire" signifiant ici de vrai binaire numérique (comme il est stocké dans un entier numérique).
      # Les formats majuscules imposent un sens de code hexa et binaire "MSB" first (bit de poids fort en premier)
      my $bitcode = unpack("B*", pack("H*", $code));
      my $bit75 = substr($bitcode, 74, 8);
     
      # Déclaration d'une variable qui contiendra la position des 32bits à décoder
      my $bitpos;
     
      #si paquet 0
      if ($bit75 eq "00000000") {
        my $bit171 = substr($bitcode, 170, 2);
     
      #Si Q_LENGTH égal 0 ou 3 
     
        if ($bit171 eq "00" || $bit171 eq "11") {
      #NID_OPERATIONAL
          $bitpos = substr($bitcode, 185, 3) eq "001" ? 217 : 209;
        }
        else {
      #NID_OPERATIONAL
          $bitpos = substr($bitcode, 200, 3) eq "001" ? 232 : 224;
        }
      }
     #Si paquet 1
      elsif ($bit75 eq "00000001") {
        my $bit195 = substr($bitcode, 194, 2);
     
     #Si Q_LENGTH égal 0 ou 3
     
        if ($bit195 eq "00" || $bit195 eq "11") {
    #NID_OPERATIONAL
          $bitpos = substr($bitcode, 209, 3) eq "001" ? 241 : 232;
        }
        else {
    #NID_OPERATIONAL
          $bitpos = substr($bitcode, 222, 3) eq "001" ? 254 : 246;
        }
      }
     
      # Construction du code décimal
      my $decoded = bin2hex(substr($bitcode, $bitpos, 32), 4) if $bitpos;
     
      # Trivial
      if ($old_decoded) {
        if ($decoded != $old_decoded) {
          warn "-> new decoded value is different from first occurence: old = $old_decoded, new = $decoded\n";
        }
        else {
          warn "-> same value ($decoded == $old_decoded)\n";
        }
      }
     
      return $decoded;
    }
     
    sub decode88($;$) {
      my ($code, $code81) = @_;
     
      my $decoded = $code;
     
      # Si le code de la ligne 81 n'est pas encore connu, il est remplacé par %s qui servira de template pour sprintf
      $code81 //= "%s";
      my @decoded = ($code81);
     
      # Convertir le code hexa en binaire
      my $bitcode = unpack("B*", pack("H*", $code));
      my $bit75 = substr($bitcode, 74, 8);
     
      # Déclaration d'une variable qui contiendra la position des 32bits à décoder
      my $bitpos;
      if ($bit75 eq "00000000") {
        my $bit171 = substr($bitcode, 170, 2);
        if ($bit171 eq "00" || $bit171 eq "11") {
          # Test du bit 186, M_LEVEL, si M_LEVEL différent de 3 (011) ce n'est pas un ERTMS niveau 2, donc on peut supprimer la ligne
          if (substr($bitcode, 185, 3) ne "011") {
            $decoded = undef;
          }
        }
        else {
          # test du bit 201, M_LEVEL, si M_LEVEL différent de 3 (011) ce n'est pas un ERTMS niveau 2, donc on peut supprimer la ligne
          if (substr($bitcode, 200, 3) ne "011") {
            $decoded = undef;
          }
        }
      }
      elsif ($bit75 eq "00000001") {
        my $bit195 = substr($bitcode, 194, 2);
        if ($bit195 eq "00" || $bit195 eq "11") {
          # Test du bit 210, M_LEVEL, si M_LEVEL différent de 3 (011) ce n'est pas un ERTMS niveau 2, donc on peut supprimer la ligne
          if (substr($bitcode, 209, 3) ne "011") {
            $decoded = undef;
          }
        }
        else {
          # test du bit 225, M_LEVEL, si M_LEVEL différent de 3 (011) ce n'est pas un ERTMS niveau 2, donc on peut supprimer la ligne
          if (substr($bitcode, 224, 3) ne "011") {
            $decoded = undef;
          }
        }
      }
     
      if ($decoded) {
    if ($bit75 eq "00000000") {
        my $bit171 = substr($bitcode, 170, 2);
        if ($bit171 eq "00" || $bit171 eq "11") {
          $bitpos = substr($bitcode, 172, 1) eq "1" ? 179 : 173;
      #décodage de la vitesse, multiplié par 5
    push @decoded,  5*bin2hex(substr($bitcode, 172, 7), undef, 0);
        }
        else {
          $bitpos = substr($bitcode, 188, 1) eq "1" ? 194 : 188;
      #décodage de la vitesse, multiplié par 5
    push @decoded,  5*bin2hex(substr($bitcode, 187, 7), undef, 0);
        }
      }
      elsif ($bit75 eq "00000001") {
        my $bit194 = substr($bitcode, 193, 2);
        if ($bit194 eq "00" || $bit194 eq "11") {
          $bitpos = substr($bitcode, 197, 1) eq "1" ? 203 : 197;
      #décodage de la vitesse, multiplié par 5
    push @decoded,  5*bin2hex(substr($bitcode, 196, 7), undef, 0);
        }
        else {
          $bitpos = substr($bitcode, 211, 1) eq "1" ? 218 : 212;
      #décodage de la vitesse, multiplié par 5
    push @decoded,  5*bin2hex(substr($bitcode, 211, 7), undef, 0);
     
     
        }
      }
     
     
     
     
        # Decoder les bit 51 à 74, NID_ENGINE
        push @decoded, bin2hex(substr($bitcode, 50, 74-50), undef, 0);
     
        # Decoder les bits 108 à 122, LRBG
        push @decoded, bin2hex(substr($bitcode, 107, 122-108), undef, 0);
     
        # Test du bit 82 pour décodage dernière colonne
        my $bit82    = substr($bitcode, 81, 1);
        #D_LRBG
        my $last_col = bin2hex(substr($bitcode, $bit82 eq "0" ? 121 : 145, $bit82 eq "0" ? 137-122 : 161-146), undef, 0);
     
        # Decodage du multiplicateur, pour le D_LRBG analyse du Q_LENGTH pour savoir si c'est en cm ou en m.
        my $bit96 = substr($bitcode, 95, 2);
        my $multi = $bit96 eq "00" || $bit96 eq "10" ? 10 : $bit96 eq "01" ? 1 : undef;
        my $last_col_unit = $bit96 eq "00" ? "cm" : $bit96 eq "01"  || $bit96 eq "10" ? "m" : "";
        push @decoded, ($last_col * $multi).$last_col_unit if $multi;
     
        #$decoded = join ";", $code, @decoded;    
        #permet de supprimer le message 88, et de garder le reste, les colonnes sont donc respectivement: 
        # date-heure, NID_OPERATIONAL, vitesse, NID_ENGINE,LRBG,D_LRBG.
        $decoded = join ";", @decoded;   
      }
     
      return $decoded;
    }

+ Répondre à la discussion
Cette discussion est résolue.
Page 11 sur 11 PremièrePremière ... 7891011

Discussions similaires

  1. [VB.NET] Import de fichiers d'une machine distante
    Par Bill_Baroud dans le forum ASP.NET
    Réponses: 3
    Dernier message: 03/06/2004, 13h16
  2. [VB.NET] Importation de fichier texte
    Par Hoegaarden dans le forum Windows Forms
    Réponses: 5
    Dernier message: 25/05/2004, 09h39
  3. Importer un fichier IDAPI32.cfg propre à chaque appli(BDE)
    Par carlhian dans le forum Bases de données
    Réponses: 3
    Dernier message: 07/05/2004, 14h18
  4. Importer des fichiers textes délimités
    Par Invité dans le forum Outils
    Réponses: 2
    Dernier message: 23/09/2002, 13h56
  5. [DEV-C++]#import de fichier .tlb
    Par pdl dans le forum Dev-C++
    Réponses: 6
    Dernier message: 19/07/2002, 22h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo