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

WinDev Discussion :

Décoder Mode PDU [WD17]


Sujet :

WinDev

  1. #1
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2011
    Messages : 177
    Points : 232
    Points
    232
    Par défaut Décoder Mode PDU
    Salut à tous, j'ai récemment poster du code pour convertir du texte en PDU.

    Actuellement je suis bloqué dans mon développement pour faire l'inverse.

    Je reçois un code PDU en Héxadécimal et je dois le convertir en texte.

    Pour ceux qui ne savent pas le PDU est la méthode d'encodage d'un sms.


    Sur ce site vous trouverez les informations nécessaires si besoin
    http://www.dreamfabric.com/sms/hello.html
    http://www.dreamfabric.com/sms/
    En principe rien qu'avec le premier lien vous devriez comprendre facilement.

    Mon problème est que je ne trouve pas de personne qui ont posté les différentes étapes sur le net. Je m'explique..

    Dans ce cas ci on envoie "hellohello" (10 caractères)
    on a le code en héxadécimal (http://twit88.com/home/utility/sms-pdu-encode-decode ce site permet de convertir pour faire des tests)
    Mais dans le cas ou j'aimerai envoyé : Il fait beau dehors
    Je ne retrouve nul part d'autres syntaxes détaillées comme le "hellohello".. Ce qui m'empêche de comprendre les modifications à faire après récursivité des traitements..

    Je vous poste mon code actuel.. Je sais lire jusque 17 caractères.. Passer ce délai mon conversion de la base 7 à la base 2 me renvoie apparemment pas la bonne solution.
    La difficulté est qu'on lit par 8 bits mais qu'on doit traiter et réécrire en 7 bits.

    Le code pour passer de l'héxa à la base 7 n'est pas mis car il n'est pas nécessaire c'est une simple conversion..
    Le code pour passer de la base 7 (8 octets) à la base 2 (7 octets)
    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
    sChai1, sChai2, sChai3,sChaine sont des chaînes
    i, nDim1, k, j, m est un entier = 0
    nMod,nMod7,nCompteur est un entier
     
    nDim1 = (Taille(SAI_B7)/7)
    nCompteur = (Taille(SAI_B7)/8)
    // Dans le cas d'un seul caractère il faut quand même faire le travail ! 
    SI nDim1 = 0 ALORS
    	nDim1 = 1
    FIN
    SI nCompteur = 0 ALORS 
    	nCompteur =1
    FIN
    tab1 est un tableau de nDim1 chaînes
    tab2 est un tableau de nDim1 chaînes
    //i démarre à zéro donc pas besoin de faire nCompteur +1
    POUR i = 0 _A_ nCompteur
    	// On remet à 1 le m ici.. Dans l'autre sens on le mettait à zéro !! 
    	nMod = modulo(m,8)
    	SI nMod = 0 ET i <> 0 ALORS
    		m = 1
    	FIN
    	sChai1= Lecture8Bit(i)
    	sChai2 = TruncD(sChai1,m)
    	// Dans le cas ou on est sur le 8ème caractère et que ce n'est pas le dernier à traiter !
    	SI m = 7 ET i <> nCompteur ALORS
    		sChai2 = TruncD(sChai1,0)
    		sChai3 = TruncG(sChai1,1)
    		// En temps normal
    	SINON SI i <> nCompteur
    		sChai3 = TruncG(sChai1,m+1)	
    	SINON 
    		// Si on tombe sur le 8ème caractère en dernier !! traitement spécial !!! 
    		nMod = modulo(i,7)
    		SI nMod = 0 ALORS
    			sChai2 =  TruncD(sChai1,0)
    		FIN
    	FIN
    	SI i < nCompteur +1 ALORS
    		j++
    		tab2[j] = sChai2
    	FIN
    	k++
    	SI k < nCompteur+2 ALORS
    		tab1[k] = sChai3 
    	FIN
    	m++
    FIN
    // i =1 donc nCompteur +1 !!! 
    POUR i = 1 _A_ nCompteur+1
    	nMod = modulo(i,8)
    	nMod7 = modulo(i+1,8)
    	 SI i <> 7 ET nMod7 = 0 ALORS
    	 	sChaine += tab1[i-1] + tab2[i]
    	 SINON SI nMod <> 0 ALORS
    		sChaine += tab2[i]
    		SI i <> 1 ALORS
    			sChai1 = tab1[i-1]
    			sChaine += tab1[i-1]
    		FIN 	
    	SINON SI i <> 1
    		sChaine += tab1[i-1] + tab2[i]
    	FIN
    FIN
    SAI_Binaire = sChaine
    Procédure lecture8bit()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PROCEDURE Lecture8Bit(ind)
    sLChaine est une chaîne =   SAI_B7
    sResul est une chaîne ANSI
     
    sResul = Milieu(sLChaine, (ind*8 + 1), 8)
     
    RENVOYER sResul
    Procédure TruncD()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    PROCEDURE TruncD(dChaine,ind)
     
    sMResult est une chaîne ANSI
     
    sMResult = Droite(dChaine,7-ind)
    RENVOYER sMResult
    Procédure TruncG()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    PROCEDURE TruncG(mChaine,ind)
    sDResult est une chaîne ANSI
     
    sDResult = Gauche(mChaine,ind)
     
    RENVOYER sDResult
    Voila j'espère avoir été le plus clair possible

    J'attend vos retours avec impatience..
    Si ça peut vous être utile :
    phrase : "howareyou" (9caractères)
    Hexa : E8F73D2C2FE7DF75
    B7 : 111010001111011100111101001011000010111111100111110111111110101
    B2 : 110100011011111110111110000111100101100101111100111011111110101

    phrase : "salut ca va ca va" (17 caractères)
    Hexa : F330BB4E078DC3207B18340E83EC61
    B7 : 11110011001100001011101101001110000001111000110111000011001000000111101100011000001101000000111010000011111011001100001
    B2 : 11100111100001110110011101011110100010000011000111100001010000011101101100001010000011000111100001010000011101101100001

    Les phrases la sont complètes et peuvent vous être utile durant vos tests..

  2. #2
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    732
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 732
    Points : 1 650
    Points
    1 650
    Par défaut
    Bonjour,

    Je vous avais donné du code qui faisait tout en plus rapide, plus court, plus complet, avec la gestion des accents et escaping.
    Je ne comprends pas pourquoi vous persistez dans cette voie.
    Le sens inverse est au moins aussi facile.

    Ensuite, ce n'est pas du cryptage mais de l'encodage, et je ne comprends pas quand vous parlez de base 7 et base 2.

  3. #3
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2011
    Messages : 177
    Points : 232
    Points
    232
    Par défaut
    j'ai toujours votre solution mise de coté mais personnellement j'ai beaucoup de mal à m'y retrouver..

    La base 2 est sur 7 octets..
    La base 7 n'est autre qu'une base 2 sur 8 octets..

    Pour passer de l'une à l'autre il faut faire un décalage d'un bits..

    Si vous avez besoin de votre code je peux vous le renvoyer.. Mais je ne m'y retrouve que très peu..

    De plus après avoir tester le résultat avec les accents je n'ai pas obtenu le bon texte..

  4. #4
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    732
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 732
    Points : 1 650
    Points
    1 650
    Par défaut
    J'ai pas regardé votre code, mais avez-vous pensé à ce cas : "1234567@" ? Une fois encodé c'est la même chose que "1234567".

    Voici un projet WD17 qui fait tout à l'endroit et à l'envers (bâclé, donc à tester)
    Fichiers attachés Fichiers attachés
    • Type de fichier : zip PDU.zip (70,6 Ko, 425 affichages)

  5. #5
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2011
    Messages : 177
    Points : 232
    Points
    232
    Par défaut
    Ok, un grand merci je jete un oeil et reviens vers vous

  6. #6
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2011
    Messages : 177
    Points : 232
    Points
    232
    Par défaut
    hé bien pour un projet baclé je suis sur le ***

    Vraiment bien fait ! même si je ne comprend pas tout malgré que je l'épluche en mode debug pour comprendre chaque étape faite, je dois reconnaître qu'il fait son travail et bien + encore..

    Un grand merci ! Je vais continuer à l'étudier pour aller rechercher la logique qui est derrière mais en attendant cela tournera amplement.. Merci

    J'appelle au vote positif pour votre post !

  7. #7
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    732
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 732
    Points : 1 650
    Points
    1 650
    Par défaut
    Si ça peut vous aider, voici de quoi afficher un entier sous forme binaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    nValeur est un entier sur 1 = 42
    sBinaire est une chaîne
     
    POUR i = 8 A 1 PAS -1
    	sBinaire += nValeur[i]
    FIN

  8. #8
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2011
    Messages : 177
    Points : 232
    Points
    232
    Par défaut
    Il me reste toutefois deux questions sur votre code que j'ai du mal à comprendre..

    Comment vous utilisez dans ce cas ci le & ?

    J'ai vu dans la doc qu'il permet de renvoyer une adresse..
    Je vois par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SI i & 7 <> 1 ALORS
    		nCar2 = nCar1 | (nSrc bitDécaleGauche ((9 - (i & 7)) & 7))
    		bufBuffer += Caract(nCar2)
    	FIN
    Je ne comprend pas le si i & 7 et la ligne du dessous..

    ainsi que ce procédé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nCar1 = ((nSrc & nMasque) bitDécaleGauche (7 - nShift)) | nCar2
    	nCar2 = (nSrc & ~nMasque) bitDécaleDroite nShift
    Si vous savez me donner une brève explication je vous en serai très reconnaissant. Merci d'avance

  9. #9
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    732
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 732
    Points : 1 650
    Points
    1 650
    Par défaut
    Le & c'est un "et" bit à bit.
    Il se trouve que "& 2^n - 1" est équivalent à "modulo 2^n".
    8 étant une puissance de 2, "& 7" revient à faire "modulo 8".

    Donc "si i modulo 8 est différent de 1 alors" ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nCar1 = ((nSrc & nMasque) bitDécaleGauche (7 - nShift)) | nCar2
    Je prends le caractère d'origine nSrc et je lui applique un masque pour isoler la partie droite.
    Par exemple le masque peut être "00011111" et le caractère "01100101".
    - nSrc & nMasque : "00011111" & "01100101" = "00000101" (les 3 1ers bits sont mis à zéros, les autres ne sont pas modifiés)
    - bitDécaleGauche (7 - nShift) : "00010100"
    - | nCar2 (nCar2 contient 2 bits à droite venant d'un autre octet) : "00010110" (si nCar2 contenait "00000010")

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nCar2 = (nSrc & ~nMasque) bitDécaleDroite nShift
    Cette fois on fait les choses à l'envers, car "~" permet d'inverser le masque :
    - ~nMasque : "11100000"
    - nSrc & ~nMasque : "11100000" & "01100101" = "01100000"
    - bitDécaleDroite nShift : "00000011" (du coup l'opération précédente n'était pas vraiment utile)
    Et nCar2 est prêt pour l'itération suivante.

    Mais du coup on voit bien que c'est buggé dans la 1ère partie, et que le masque ne sert pas.
    Là j'ai du boulot, mais je vérifierai ça dans la journée.

  10. #10
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2011
    Messages : 177
    Points : 232
    Points
    232
    Par défaut
    Ok, magnifique j'suis en train de faire le plein d'informations en windev
    Merci

    Est-ce qu'il est possible d'enlever les espaces dans le buffer?
    J'ai essayé le sans espace en fin de traitement mais ça n'a pas fonctionné..

  11. #11
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    732
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 732
    Points : 1 650
    Points
    1 650
    Par défaut
    Heu je vous signale que j'ai modifié le post ci-dessus et que j'ai l'impression que mon code a un bug. Je reviendrai le vérifier/corriger un peu plus tard. Pour supprimer tous les espaces, Remplace(sTexte, " ", "").

    PS. Ah non, il est bon mon code, mais j'ai eu moi-même du mal à le comprendre !

  12. #12
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2011
    Messages : 177
    Points : 232
    Points
    232
    Par défaut
    J'ai fais le tour du code et il me semble l'avoir bien compris

    La dernière modification que je devrais y apporter et que vous récupérez la valeur de votre buffer source.. Or je voudrais directement récupérer la valeur stockée en héxadécimale pour faire la conversion..

    Car lors de la réception d'un sms on reçoit de l'hexa directement.. Et le seul soucis c'est que dans le buffer il met un espace automatiquement..
    Donc la taille est faussée.. et j'ai beau faire un sans espace ou un remplace(" " ,"") rien ne change..

    Je vais finir par trouver un moyen..

  13. #13
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    732
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 732
    Points : 1 650
    Points
    1 650
    Par défaut
    En fait il doit y avoir confusion.
    Dans la donc on parle d'hexadécimal mais en réalité il s'agit de données binaires brutes, pas affichées dans une quelconque base.
    Normalement vos interfaces permettent de récupérer un buffer que vous transmettez directement à PDUVersAsc().
    Pouvez-vous me montrer les fonctions que vous utilisez pour récupérer ce buffer ?

  14. #14
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2011
    Messages : 177
    Points : 232
    Points
    232
    Par défaut
    J'ai gardé votre code actuellement pour le maîtriser et faire des modifications par la suite si besoin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SAI_PDU = BufferVersHexa(bufBuffer, 1, 10000)
    à ce moment la on envoit la chaine de caractères qui a une valeur ascii par caractère et qui est traduite en hexadécimale..

    et qd vous faites gPDUVersASC vous n'envoyez pas des chiffres mais vous envoyez les caractères.. ils ont la même valeur sauf que c'est la valeur en héxa que j'ai besoin de récupérer et ensuite il y a un calcul à faire pour le nombre de caractères à transférer.. Je peux le faire aisement si j'arrive à récupérer le nombre de caractères hexa sans espace..

    je sais pas si j'ai été assez clair il est vrai que je me perd dans des détails parfois ^^

  15. #15
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    732
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 732
    Points : 1 650
    Points
    1 650
    Par défaut
    Je ne comprends pas.
    Donne le nombre d'octets.

    Normalement votre interface avec le matériel prend en paramètre un buffer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SendPDUMessage(&bufBuffer, Taille(bufBuffer))
    (j'invente une fonction bidon, mais ça devrait être dans cet esprit)

    BufferVersHexa ne sert qu'à afficher le buffer de manière lisible par un humain.
    Ca n'a rien à faire dans une fonction de transfert de données. Sinon ça ne vaut vraiment pas le coup de gagner 1 caractère sur 8, puisqu'on les multiplierait ensuite par 2 !

  16. #16
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2011
    Messages : 177
    Points : 232
    Points
    232
    Par défaut
    le problème est qu'en faisant ainsi le paramètre qu'on envoi est par exemple :

    éYea qui corresponde aux valeurs héxadécimales..

    Mais lors de la réception d'un sms on est censé recevoir de l'héxa..

    Donc ce qu'il faut traiter c'est une chaine de caractère avec les valeurs hexadécimales.. je vais essayer de remplacer le buffer par une chaine de caractère et voir ce que ça va donner..

    Car en enlevant les espaces au lieu de me renvoyer 61 il me renvoie 6<0>1<0>..

    ce qui ne m'arrange pas.. :/

  17. #17
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    732
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 732
    Points : 1 650
    Points
    1 650
    Par défaut
    C'est parce que vous êtes en unicode, il faut utiliser une chaîne ANSI.
    Mais j'insiste, vous ne devriez pas avoir à passer par ce format en représentation hexa ! Vous avez une étape inutile et encombrante dans votre interface. Essayez de la supprimer.

  18. #18
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2011
    Messages : 177
    Points : 232
    Points
    232
    Par défaut
    En réalité le format hexadécimal je n'ai pas le choix.. C'est ce que je reçois par la simbox...

    Mais ne vous inquiétez pas j'ai fait une petite boucle me permettant de remédier à tout ça..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TANTQUE i < Taille(schaine)
    	sTmp2 = schaine [[ i A i+1]]
    	bufSource += Caract(Val(sTmp2,"x"))
    	i += 2	
    FIN
    avec ces 4 lignes ici je transforme les données hexa reçues par la simbox en lettre comme vous passiez dans le buffer.. et ensuite le buffer peut être traité comme vous me l'avez montré..

    Le tout est parfaitement opérationnel.. et il n'y a que 4 lignes en plus dans le code..

    Je vous remercie encore en tout cas j'ai pu apprendre pas mal de chose grâce à vous et surtout j'ai pu finir ce projet !

    Un grand merci !

  19. #19
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2003
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Hibernatus34 Voir le message
    Bonjour,

    Je vous avais donné du code qui faisait tout en plus rapide, plus court, plus complet, avec la gestion des accents et escaping.
    Je ne comprends pas pourquoi vous persistez dans cette voie.
    Le sens inverse est au moins aussi facile.

    Ensuite, ce n'est pas du cryptage mais de l'encodage, et je ne comprends pas quand vous parlez de base 7 et base 2.
    Bonjour Hibernatus34,

    est-il possible d'obtenir ce code sachant que nous utilisons WD16?
    je bute sur la codification 7bits pour pouvoir envoyer des SMS au format PDU...

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

Discussions similaires

  1. Le grand mode d'emploi du forum, à lire si vous souhaitez tout savoir !
    Par Anomaly dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 03/06/2013, 17h36
  2. [WD17] Cadeau PDU Mode SMS
    Par GiGii dans le forum WinDev
    Réponses: 6
    Dernier message: 06/01/2013, 23h24
  3. Cadeau PDU Mode SMS
    Par GiGii dans le forum Contribuez
    Réponses: 0
    Dernier message: 27/06/2012, 10h49
  4. programme java qui convertit un texte en mode PDU
    Par angel04 dans le forum Général Java
    Réponses: 2
    Dernier message: 22/04/2011, 11h19
  5. Décoder des SMS au format PDU
    Par alexparis dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 16/12/2005, 17h55

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