PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Conversion C vers Windev
Conversion C vers Windev
Débuté par Cendrine, 20 jan. 2022 19:00 - 7 réponses
Posté le 20 janvier 2022 - 19:00
Bonjour la Team,
J'essaye de convertir une fonction codé en C vers Windev mais je bloque...
public static string ConvertSn(string sn) {
string str = "";
long num = long.Parse(sn, NumberStyles.AllowHexSpecifier);
for (int index = 0; index < 4; ++index)
{
str += (char)(object) "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ+-$£€"[(int) (num & 63L)];
num >>= 6;
}
return str;
}

Merci de votre aide :)
Membre enregistré
227 messages
Popularité : +18 (20 votes)
Posté le 21 janvier 2022 - 14:40
Bonjour,

ça fait 15 que j'ai pas fait de C

Mais si je comprends c'est une fonction qui doit retirer des caractères d'une chaine ?
Seuls les caractères suivant "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ+-$£€" doivent être gardé?

C'est exact.
Membre enregistré
945 messages
Popularité : +102 (110 votes)
Posté le 21 janvier 2022 - 21:07
Bonjours
à votre place au lieu de traduire cette fonction je l'ajouterais directement dans le code Windev cela vous évitera de générer des erreurs
pour cela regardez ce post https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/239701-saisir-code-239894/read.awp…

--
«Nos clients sont nos meilleurs beta testeur.» H. Mintzberg
«Un programme informatique fait ce que vous lui avez dit de faire, pas ce que vous voulez qu'il fasse» Troisième loi de Greer
Membre enregistré
351 messages
Popularité : +75 (75 votes)
Posté le 24 janvier 2022 - 01:35
Bonjour Cendrine,

Gurdarr a écrit :
Bonjour,

ça fait 15 que j'ai pas fait de C

Mais si je comprends c'est une fonction qui doit retirer des caractères d'une chaine ?
Seuls les caractères suivant "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ+-$£€" doivent être gardé?

C'est exact.

Pas vraiment ... c'est donc inexact ! Au coin !

Cendrine a écrit :
Bonjour la Team,
J'essaye de convertir une fonction codé en C vers Windev mais je bloque...


> public static string ConvertSn(string sn) {
Déclaration d'une fonction ConvertSn avec comme paramètre "sn" qui est une chaine et qui retourne une chaine
Equivalent :
Procedure ConvertSn(sn est une chaine) : chaine

string str = "";

Déclaration d'une chaine
Equivalent :
str est une chaine = ""

> long num = long.Parse(sn, NumberStyles.AllowHexSpecifier);
Retourne dans la variable "num" de type entier sur 4 octets la conversion de la chaine hexadécimal qui est dans la variable "sn"
Equivalent :
num est un entier sur 4 octets = HexaVersEntier(sn)

for (int index = 0; index < 4; ++index)
{

Boucle de 0 à 3
Equivalent :
Pour index = 0 _A_ 3

> str += (char)(object) "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ+-$£€"[(int) (num & 63L)];
Ajoute dans la chaine "str" le caractère qui est à la position des 6 premiers bits de "num" (ATTENTION ... les tableaux en C commencent à 0 et non à 1), il faut donc ajouter 1.
Equivalent :
Milieu("123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ+-$£€",ETBinaire(num,63) + 1,1)

num >>= 6;

Réalise un décalage à droite de 6 bits sur la variable "num"
Equivalent :
num = bitDécaleDroite(num,6)

> }
Equivalent :
FIN

return str;

Equivalent :
Renvoyer str

}

Merci de votre aide

Ce qui donne :
Procedure ConvertSn(sn est une chaîne) : chaîne

str est une chaîne = ""
num est un entier sur 4 octets = HexaVersEntier(sn)
POUR index = 0 _À_ 3
str += Milieu("123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ+-$£€",ETBinaire(num,63) + 1,1)
num = bitDécaleDroite(num,6)
FIN

Ce n'est pas compliqué ... pas besoin d'utiliser du C# pour ce genre de code.

Et pour finir ... la même routine mais 2,5 fois plus rapide :
Procedure ConvertSn(sn est une chaîne) : chaîne

table est une chaîne = "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ+-$£€"
str est une chaîne = ""
num est un entier sur 4 octets = HexaVersEntier(sn)
POUR index = 1 _À_ 24 PAS 6; str += table[num[index SUR 6] + 1]; FIN
RENVOYER str


--
Bon développement, Patrick [3po.fr]
Posté le 24 janvier 2022 - 13:27
Philippe Pasquali -> Ce que je fais déjà mais je veux sortir de l'utilisation des librairies .NET.

Patrick ALLÉMOZ -> Merci c'est au top, je teste :) et reviens vers vous.
Posté le 24 janvier 2022 - 18:39
Merci ça marche super :)
Alors comme tout est ok et comme vs êtes de bon conseil j'ai une dernière fonction en C que je souhaite convertir.
gsNumérodeserie est une chaine ="DEDRD4417"

machaine est une chaîne =  encodeSerial(gsNumérodeserie,"motdepasse")

/// J'appelle ma procedure en C
public static string encodeSerial (string gsNumérodeserie, string key)
{
DESCryptoServiceProvider cryptoServiceProvider = new DESCryptoServiceProvider();
cryptoServiceProvider.Key = Encoding.ASCII.GetBytes(key);
cryptoServiceProvider.IV = cryptoServiceProvider.Key;
ICryptoTransform encryptor = cryptoServiceProvider.CreateEncryptor();
byte[] bytes = Encoding.ASCII.GetBytes(s);
return Convert.ToBase64String(encryptor.TransformFinalBlock(bytes, 0, bytes.Length));
}



J'ai commencé à essayer ceci en WD :

macle est un Buffer = HashChaîne(HA_SHA_160, gsNumérodeserie)
Trace(Crypte(macle,"motdepasse",crypteAucun,encodeBASE64))


Mais je n'ai pas les même résultats... je pense un problème au niveau du HashChaîne(HA_SHA_160, gsNumérodeserie)

Merci de votre aide :)
Membre enregistré
3 846 messages
Popularité : +227 (347 votes)
Posté le 24 janvier 2022 - 22:06
Bonjour,
Dans un premier temps, pour la même chaine, deux appels à une même fonction de chiffrement donnera 2 résultats différents.
Dans un deuxième temps, il existe de nombreux algorithmes de chiffrement. En WL, CrypteStandard (qui remplace Crypte) en propose 4.
Enfin il existe aussi de nombreuses fonctions de hachage.

Sachant que tu ne connais ni l'algo de chiffrement, ni l'algo de hashage, tu ne peux pas reproduire de manière fiable la fonctionnement de la fonction C que tu appelles. D'après ma première remarque ce serait de toute façon un pure hasard que tu te retrouve avec le même résultat

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
351 messages
Popularité : +75 (75 votes)
Posté le 26 janvier 2022 - 00:58
Bonjour Cendrine,

Cendrine a écrit :
Merci ça marche super
Alors comme tout est ok et comme vs êtes de bon conseil j'ai une dernière fonction en C que je souhaite convertir.

De rien !
Je pense que ta routine C était plutôt du genre :
public static string encodeSerial (string s, string key)

L'algorithme de cryptage est clairement indiqué dans le code, c'est DES, un vieux truc que l'on n'utilise plus depuis le siècle dernier vu qu'il faut très peu de temp pour le cracker ... mais bref ce n'est pas le sujet. Ce cryptage nécessite une clé sur 64 bits ... soit 8 caractères. Le retour se fait en Base64

Voila ce qui devrait correspondre à ton code, à tester car je n'ai rien sous la main pour le faire aujourd'hui :
gsNumérodeserie est un Buffer = "DEDRD4417"
Clé est un Buffer = "password"
Chaine_Cryptée est une chaîne = Encode(CrypteStandard(gsNumérodeserie,Clé,crypteDES),encodeBASE64SansRC)
Trace(Chaine_Cryptée)
Chaine_Décryptée est une chaîne = DécrypteStandard(Decode(Chaine_Cryptée,encodeBASE64SansRC),Clé,crypteDES)
Trace(Chaine_Décryptée)

Attention ... chaque cryptage est différent car le mot de passe permet la génération d'un vecteur d'initialisation (IV) aléatoire. Pour tester ton cryptage, il faut donc le décrypter avec la clé !

--
Bon développement, Patrick [3po.fr]