


La moindre des choses est de lire l'ensemble des messages et de donner une réponse.
Code : Tout sélectionner
Declare.i X(nombre.i,code)
Declare decoupe(nombre.s)
calldebugger
nombre.s="13213210346513210654849306506846860686468600"
debug "chaines de reference "+nombre.s
global newlist sequence.s()
decoupe(nombre.s) ; on decoupe nombre
; ****** affiche le contenu de la liste ******
ResetList(sequence.i())
While NextElement(sequence.i())
Debug "la valeur ="+str(val(sequence.i()) ); Affiche tous les éléments de la liste
encode.i=X(val(sequence.i()),8)
decode.i=X(encode.i,8)
debug "encodé donne ="+ str(encode)
Debug "Decodé donne ="+str(decode.i)
Debug " *************************"
Wend
Procedure.i X(nombre.i,code)
result.i=nombre.i ! code
ProcedureReturn result.i
Endprocedure
procedure decoupe(nombre.s)
; Dobro
ClearList(sequence.s())
id= CountString(nombre.s,"0")
For i=1 to id
sortie.s=stringfield(nombre.s,i,"0")
if Sortie.s<>""
AddElement(sequence.s())
sequence.s()=sortie.s
Endif
Next i
Endprocedure
; EPB
Le code que j'ai proposé et le code reversible de SPH répondait à la demande initiale de Micoute. Le résultat du code est conforme à ce qu'il demandaitton code n'apporte pas ce résultat ! ....
Juste pour la vérificationMicoute a écrit :C'est pourtant simple,
1 = 1, 2 = 2, 3 = 3, 4 = 4, 5 = 5, 6 = 6, 7 = 7, 8 = 8, 9 = 9, 10 = 11, 11 = 12, 12 = 13, 13 = 14, 14 = 15, 15 = 16, 16 = 17, 17 = 18, 18 = 19, 19 = 21, 20 = 22, 21 = 23, 22 = 24, 23 = 25, 24 = 26, 25 = 27, 26 = 28, 27 = 29, 28 = 31, etc...
Code : Tout sélectionner
Procedure NombreSansZero(Value)
Protected X,N
For X=1 To Value
If Right(Str(X+N),1)="0"
N+1
EndIf
Next
ProcedureReturn(Value+N)
EndProcedure
For i= 1 To 28
Debug Str(i)+" = " +Str(NombreSansZero(i))
Next
Code : Tout sélectionner
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
10 = 11
11 = 12
12 = 13
13 = 14
14 = 15
15 = 16
16 = 17
17 = 18
18 = 19
19 = 21
20 = 22
21 = 23
22 = 24
23 = 25
24 = 26
25 = 27
26 = 28
27 = 29
28 = 31
Micoute a écrit :Si je veux exclure le zéro, c'est parce qu'il va me servir de séparateur, ainsi 13213210346513210 peut mieux se découper si je sais où je dois le faire, mais si je mets un autre caractère, mon code va être cracké tout de suite, car 1321321|34651321| ça se remarque toute de suite.SPH a écrit :Bon, et a quoi sert ta routine ?
ce code l'est :Micoute a écrit : Veuillez m'excuser pour la complexité, mais je souhaite vraiment faire un codage incrackable !!!
Code : Tout sélectionner
Declare.i X(nombre.i,code)
Declare decoupe(nombre.s)
calldebugger
nombre.s="13213210346513210654849306506846860686468600"
debug "chaines de reference "+nombre.s
global newlist sequence.s()
decoupe(nombre.s) ; on decoupe nombre
; ****** affiche le contenu de la liste ******
ResetList(sequence.i())
While NextElement(sequence.i())
Debug "la valeur ="+str(val(sequence.i()) ); Affiche tous les éléments de la liste
encode.i=X(val(sequence.i()),8)
decode.i=X(encode.i,8)
debug "encodé donne ="+ str(encode)
Debug "Decodé donne ="+str(decode.i)
Debug " *************************"
Wend
Procedure.i X(nombre.i,code)
result.i=nombre.i ! code
ProcedureReturn result.i
Endprocedure
procedure decoupe(nombre.s)
; Dobro
ClearList(sequence.s())
id= CountString(nombre.s,"0")
For i=1 to id
sortie.s=stringfield(nombre.s,i,"0")
if Sortie.s<>""
AddElement(sequence.s())
sequence.s()=sortie.s
Endif
Next i
Endprocedure
; EPB
+1Ar-S a écrit :Par contre Micoute, essaye d'être vraiment explicite lors de ta prochaine demande, c'est frustrant d'avoir à "comprendre" exactement ton problème si tu ne l'es pas. C'est toujours pas clair (pour moi en tout cas)
Si j'avais su ça plus tot ......Micoute a écrit :tout d'abord, je tiens à préciser qu'il ne faut jamais qu'un nombre comporte un 0, car le 0 a une fonction spécifique, celui de séparateur.
hum !Micoute a écrit :Je tiens aussi à préciser que je veux inventer une méthode de codage inconnue à ce jour
alors sache que ce manque de zero (je parle dans le résulat Encodé) va forcement sauter au yeux ...mais seulement l'absence du 0 dans les nombre est très important
Code : Tout sélectionner
Enumeration
#Fenetre
#Base_de_donnees
#Liste
#Bouton_Reset
#Bouton_Ajouter
#Bouton_MAJ
#Bouton_Supprimer
#Texte_Index
#Texte_Base10
#Texte_Base9
#Chaine_Index
#Chaine_Base10
#Chaine_Base9
EndEnumeration
UseSQLiteDatabase()
Global A.i
Global.s Fichier_de_donnees = GetCurrentDirectory() + "Base9.SQLite"
Global.s ReqSql, Table = "Valeurs"
Procedure Base9VersDecimal(NombreBase9.i)
If OpenDatabase(#Base_de_donnees,Fichier_de_donnees, "", "", #PB_Database_SQLite)
ReqSql = "SELECT * FROM " + Table
EndIf
If DatabaseQuery(#Base_de_donnees, ReqSql) <> NombreBase9
While NextDatabaseRow(#Base_de_donnees)
Base10 = GetDatabaseLong(#Base_de_donnees, 0)
Base9 = GetDatabaseLong(#Base_de_donnees, 1)
If Base9 = NombreBase9
resultat = Base10
EndIf
Wend
FinishDatabaseQuery(#Base_de_donnees)
EndIf
CloseDatabase(#Base_de_donnees)
ProcedureReturn resultat
EndProcedure
Procedure Base10VersBase9(NombreBase10.i)
If OpenDatabase(#Base_de_donnees,Fichier_de_donnees, "", "", #PB_Database_SQLite)
ReqSql = "SELECT * FROM " + Table
;Debug ReqSql
EndIf
If DatabaseQuery(#Base_de_donnees, ReqSql) <> NombreBase10
While NextDatabaseRow(#Base_de_donnees)
Base10 = GetDatabaseLong(#Base_de_donnees, 0)
Base9 = GetDatabaseLong(#Base_de_donnees, 1)
If Base10 = NombreBase10
resultat = Base9
EndIf
Wend
FinishDatabaseQuery(#Base_de_donnees)
EndIf
CloseDatabase(#Base_de_donnees)
ProcedureReturn resultat
EndProcedure
UseSQLiteDatabase()
Procedure CreerBase()
If FileSize(Fichier_de_donnees) < 0
If CreateFile(#Base_de_donnees, Fichier_de_donnees)
CloseFile(#Base_de_donnees)
If OpenDatabase(#Base_de_donnees,Fichier_de_donnees, "", "", #PB_Database_SQLite)
MessageRequester("", "Base de données "+ Fichier_de_donnees + " créée")
; Créer une table
ReqSql = "CREATE TABLE " + Table + " (Base10 TEXT, Base9 TEXT);"
DatabaseUpdate(#Base_de_donnees, ReqSql)
;Debug ReqSql
EndIf
EndIf
EndIf
MessageRequester("INFO", "Base de données terminée" + #CRLF$ + "Veuillez presser une touche")
EndProcedure
Procedure.s CoderBase10Vers9(Reste, Depart = 0)
A = Depart
For I = 1 To Reste
A + 1
While FindString(Str(A), "0", 1) > 0
A + 1
Wend
Next
ProcedureReturn Str(A)
EndProcedure
Procedure Mise_a_jour()
If OpenDatabase(#Base_de_donnees,Fichier_de_donnees, "", "", #PB_Database_SQLite)
; Ajouter des valeurs de 1 à 16777215
For i = 635000 To 635999 ;par petits paquets pour ne pas faire trop chauffer les processeurs
ReqSql = "(Base10, Base9) VALUES ('" + i + "','" + CoderBase10Vers9(i) + "');"
DatabaseUpdate(#Base_de_donnees, "INSERT INTO " + Table + ReqSql)
Next
CloseDatabase(#Base_de_donnees)
EndIf
EndProcedure
;CreerBase()
TempsDepart = ElapsedMilliseconds() ; Récupère la valeur actuelle
;Mise_a_jour() ;commenter pour éviter de réécrire les mêmes données
TempsEcoule = ElapsedMilliseconds()-TempsDepart
Debug "Temps écoulé : "+Str(TempsEcoule/1000)+" secondes"
Debug Base9VersDecimal(1152293)
Debug Base10VersBase9(624999)
D'accord, mais seules les personnes autorisées aurons le code de codage et de décodage, le fichier codé sera livré "tel quel" et c'est pour ça qu'il doit être très protégéDobro a écrit :n'oublie pas que ton code de "Decodage" va etre integré a ton prg ...
il est assez facile avec un Debugger genre OllyDbg de tracer ton code
et d'isoler la routine de Decodage ...
on peux même l'extraire et faire un "KeyGen" avec