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

C# Discussion :

Processus inverse d'une fonction de decodage d'un code-barre [Débutant]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Par défaut Processus inverse d'une fonction de decodage d'un code-barre
    Bonjour à tous,

    dans le cadre de mon boulot, un collègue avez créé un bout de code qui nous permettez à partir d'un code-barre de nos produits de retrouver différentes informations comme:
    - l'identifiant produit
    - le type de flacon
    - le numéro de lot
    - le numéro de flacon
    - la date de péremption

    par exemple de CB suivant "!328>P|%72046191" donne:

    - l'identifiant produit: E21
    - le type de flacon: 4
    - le numéro de lot: 72046191
    - le numéro de flacon: 707
    - la date de péremption: 01/02/2018

    Jusque là pas de problème.

    Par contre ce collègue n'est plus parmi nous et nous souhaiterions modifier son code pour faire l'inverse. A savoir, à partir des différentes infos (ID produit, type de flacon ect..) recréer le CB.

    C'est là ou cela se complique car mes connaissance en C# ne sont pas d'un niveau avancé et je vois pas trop comment faire (surtout la conversion des formules "mathématique").

    Ci dessous la fonction que je souhaite "inverser":

    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
     
    public void convertReagentOrCtrCalBarcode(string sBarCode)
            {         
                int length = sBarCode.Length;
                int num = 0;
                double num2 = 0.0;
                DateTime time = default(DateTime);
                string text = "";
                string text2 = "";
     
                text2 = string.Concat(new string[]
    	{
    		text2,
    		", Barcode: ",
    		sBarCode,
    		", len: ",
    		length.ToString()
    	});
                int num3 = length;
     
     
                            rsLotId = sBarCode.Substring(8, 8);
                            for (int i = 0; i < length - 8; i++)
                            {
                                int num4 = "!#$%&'()*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`|}~".IndexOf(sBarCode[i]);
     
                                num2 += (double)num4 * Math.Pow((double)"!#$%&'()*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`|}~".Length, (double)(length - 8 - i - 1));
                            }
                            text = num2.ToString().PadLeft(14, '0');
                            text2 = text2 + ", barcode: " + text;
                            text2 = text2 + ", lot: " + rsLotId;
                            string text3 = "01";
                            string text4 = text.Substring(num, 2);
     
                            num += 2;
                            string text5 = text.Substring(num, 2);
                            text5 = "20" + text5;
                            num += 2;
     
                            time = new DateTime(int.Parse(text5), int.Parse(text4), int.Parse(text3));
                            time = time.AddMonths(1);
                            rlExpiryDate = Convert.ToInt32(ConvertToUnixTimestamp(time));
     
                            string text6 = text.Substring(num, 5);
                            num += 5;
                            string text7 = int.Parse(text6).ToString("X4");
     
                            rsManufNbr = text7.Substring(0, 3);
                            rcVialType = text7[3];
                            riVesselNumber = int.Parse(text.Substring(num, 5));
     
     
                            label1.Text = rsManufNbr.ToString();
                            label2.Text = rsLotId.ToString();
                            label3.Text = riVesselNumber.ToString();
                            label4.Text = rcVialType.ToString();
                            label5.Text = time.ToString();
     
     
     
            }
    Merci pour votre aide.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Salut,

    une piste de lecture pour repliquer sous C# ce qu'on peut faire avec VBA :
    http://domi2.developpez.com/tutoriel.../codes-barres/
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Par défaut
    Salut

    Merci pour le lien mais cela ne va pas m'aider... en tout cas pour le moment. En effet, sur ton lien il s'agit de de créer le CB à partir d'une chaine de caractère, or dans mon cas je cherche à creer cette chaine de caractère.

    En effet, les différentes infos (lot ect...) sont codés dans la chaîne de caractère finale et ce que je cherche a faire c'est créer la chaine de caractères à partir des différents éléments (lot ect...) et là il s'agit de codage pur.... avec la création de la fonction inverse de celle indiqué dans mon premier message... et là je vois bien le principe mais cela dépasse mes compétences.

    En tout cas merci d'avoir répondu

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    La nomenclature de codage est quelque chose que tu peux decider, par exemple
    A_B_C_D
    A/B/C/D
    voire meme
    A_B/C_D
    et bien sur un encodage
    A'B'C'D'
    du coup la facon dont tu agences les donnees en amont te permet de determiner la facon dont tu liras les donnees en aval.

    Ici on cherchera donc a determiner a partir du decodage de l'information, l'encodage qui sera a faire

    par exemple de CB suivant "!328>P|%72046191" donne:

    - l'identifiant produit: E21
    - le type de flacon: 4
    - le numéro de lot: 72046191
    - le numéro de flacon: 707
    - la date de péremption: 01/02/2018
    Autant le numero de lot apparait clairement, autant les autres informations sont encodees. Quel algorithme utilises tu pour le decoder ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Par défaut
    L'algorithme 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
     
    public void convertReagentOrCtrCalBarcode(string sBarCode)
            {         
                int length = sBarCode.Length;
                int num = 0;
                double num2 = 0.0;
                DateTime time = default(DateTime);
                string text = "";
                string text2 = "";
     
                text2 = string.Concat(new string[]
    	{
    		text2,
    		", Barcode: ",
    		sBarCode,
    		", len: ",
    		length.ToString()
    	});
                int num3 = length;
     
     
                            rsLotId = sBarCode.Substring(8, 8);
                            for (int i = 0; i < length - 8; i++)
                            {
                                int num4 = "!#$%&'()*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`|}~".IndexOf(sBarCode[i]);
     
                                num2 += (double)num4 * Math.Pow((double)"!#$%&'()*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`|}~".Length, (double)(length - 8 - i - 1));
                            }
                            text = num2.ToString().PadLeft(14, '0');
                            text2 = text2 + ", barcode: " + text;
                            text2 = text2 + ", lot: " + rsLotId;
                            string text3 = "01";
                            string text4 = text.Substring(num, 2);
     
                            num += 2;
                            string text5 = text.Substring(num, 2);
                            text5 = "20" + text5;
                            num += 2;
     
                            time = new DateTime(int.Parse(text5), int.Parse(text4), int.Parse(text3));
                            time = time.AddMonths(1);
                            rlExpiryDate = Convert.ToInt32(ConvertToUnixTimestamp(time));
     
                            string text6 = text.Substring(num, 5);
                            num += 5;
                            string text7 = int.Parse(text6).ToString("X4");
     
                            rsManufNbr = text7.Substring(0, 3);
                            rcVialType = text7[3];
                            riVesselNumber = int.Parse(text.Substring(num, 5));
    Pour info la taille de la chaine de caractère (sBarCode) fait 16 dans le cas de nos CB.

    On voit que les 8 derniers caractères correspondent au numéro de lot et qu'avec les 8 premiers caractères, on retrouve les autres infos (date d'expiration ect...).
    C'est cette partie qui me pose soucis, notamment la boucle "for" avec le calcul de num2.

    Je vois pas trop comment m'y prendre pour faire le processus inverse.

  6. #6
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Avec une fonction écrite en petit chinois ça va être compliqué ; ma suggestion serait de te créer quelques tests unitaires pour éviter les régressions puis de tenter de réécrire la fonction de décodage avec des noms de variable significatifs jusqu'à ce quelle devienne compréhensible.

    Edit : je trouve quand même curieux qu'il y ait une fonction de décodage mais pas d'encodage ; comment sont générés ces codes barre ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Etude inverse d'une fonction : xj=F(y,xi)
    Par elmoukrie dans le forum MATLAB
    Réponses: 0
    Dernier message: 25/04/2017, 20h31
  2. Réponses: 10
    Dernier message: 23/05/2016, 20h44
  3. processus qui appel une fonction
    Par gastoncs dans le forum C
    Réponses: 4
    Dernier message: 03/05/2012, 11h06
  4. Opération inverse d'une fonction
    Par fadiese_1 dans le forum Delphi
    Réponses: 6
    Dernier message: 26/12/2006, 18h53
  5. Connaitre le processus qui appelle une fonction API
    Par RazielReaver dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 28/05/2006, 13h56

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