PureBasic

Forums PureBasic
Nous sommes le Mar 16/Juil/2019 7:17

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 2 messages ] 
Auteur Message
 Sujet du message: Bug allocatememory en unicode [pb4.20][Résolu]
MessagePosté: Dim 03/Aoû/2008 19:15 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 25/Aoû/2004 6:31
Messages: 2594
Localisation: Eragny
Bonjour,

Aaaa les vacances c'est bien, mais sans internet parfois lorqu'on code c'est un peu galère.Voici mon code. Si vous compilez en normal ça fonctionne en unicode il y a toujours un moment ou ça plante sur un allocatememory.
Est ce que c'est moi ou bien il y a bien un problème ?
Je me demande d'ailleur si ça vient d'AllocateMemory ou bien de la fonction StringByteLength()
A votre avis ?
Merci d'avance !

Code:
Structure Prefs
Cle.s
EndStructure

Global Prefs.Prefs
prefs\Cle="Monpassword"

Procedure.s mkpass(password_length)
chars$="abcdefghijklmnopqrstuvwxyz1234567890" ; possible characters, keep these lcase
For a=1 To password_length
Select Random(1) ; 0 = char, 1 = digit
  Case 1 ; is digit
   pass$+Str(Random(9))
  Case 0 ; is character
   position=Random(Len(chars$)) ; random character selector
   char_case = Random(10)
   If char_case<5 ; less than 5 is ucase
    pass$+UCase(Mid(chars$,position,1))
   Else
    pass$+Mid(chars$,position,1)
   EndIf
  EndSelect
Next
ProcedureReturn pass$
EndProcedure

Procedure RC4Mod(a,b)
  ProcedureReturn a-(a/b)*b
EndProcedure

Procedure.l RC4Mem(Mem.l, memLen.l, key.s)
  ;RC4Mem(*MemoryBuffer.l, MomeryLength.l, Key.s)
 
  Dim S.w(255)
  Dim K.w(255)
  i.l=0: j.l=0: t.l=0: x.l=0
  temp.w=0: y.w=0
  Outp.s=""
 
  For i = 0 To 255
    S(i) = i
  Next
 
  j = 1
  For i = 0 To 255
    If j > Len(key)
      j = 1
    EndIf
    K(i) = Asc(Mid(key, j, 1))
    j = j + 1
  Next i
 
  j = 0
  For i = 0 To 255
    j = RC4Mod(j + S(i) + K(i), 256)
    temp = S(i)
    S(i) = S(j)
    S(j) = temp
  Next i
 
  i = 0
  j = 0
  For x = 0 To memLen-1
    i = RC4Mod(i + 1, 256)
    j = RC4Mod(j + S(i),256)
    temp = S(i)
    S(i) = S(j)
    S(j) = temp
    t = RC4Mod(S(i) + RC4Mod(S(j), 256) , 256)
    y = S(t)
    PokeB(Mem+x, PeekB(Mem+x)!y)
  Next
  ProcedureReturn Mem
EndProcedure

Procedure.s BuildInCrypteText(Text.s, Key.s)
   Protected CrypteText.s
  If Len(Text)>0   
     *mem=AllocateMemory(StringByteLength(Text))
    PokeS(*mem,Text)
    RC4Mem(*mem,StringByteLength(Text),Key)
    CrypteText=PeekS(*mem)
    FreeMemory(*mem)
  EndIf
  Debug "Crypte :"+Text+" =>"+CrypteText
   ProcedureReturn CrypteText
EndProcedure

Procedure.s BuildInDecrypteText(Text.s, Key.s)
  Protected DeCrypteText.s
  If Len(Text)>0
    Debug StringByteLength(Text)
     *mem=AllocateMemory(StringByteLength(Text))
    PokeS(*mem,Text)
    RC4Mem(*mem,StringByteLength(Text),Key)
    DeCrypteText=PeekS(*mem)
    FreeMemory(*mem)
  EndIf
  Debug "DeCrypte :"+Text+" =>"+DeCrypteText
   ProcedureReturn DeCrypteText
EndProcedure

;********************
;Le choix du système de cryptage
;********************
Procedure.s CrypteText(Text.s)
   ProcedureReturn BuildInCrypteText(Text.s, Prefs\Cle)
EndProcedure

Procedure.s DecrypteText(Text.s)
   ProcedureReturn BuildInDecrypteText(Text.s, Prefs\Cle)
EndProcedure

For z=1 To 200
  test.s=CrypteText(mkpass(Random(4)+1))
  result.s=DecrypteText(test)
  Debug test+" "+result
Next



Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Lun 04/Aoû/2008 6:14 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 25/Aoû/2004 6:31
Messages: 2594
Localisation: Eragny
la solution a été trouvé :oops: pas de bug purebasic mais bien une bourde de Thyphoon... :lol:

en verité quand je fais mon allocate mémory je prenais la taille de la chaine de caractère mais j'ai oublié quelques choses d'important :
dans la doc pour StringByteLength(Chaine$ [, Format])
Citation:
Note: le nombre d'octets renvoyé n'inclus pas le caractère 'nul' de fin de chaîne. La taille du caractère nul est de 1 octet en mode ASCII et UTF-8 et de 2 octets en mode unicode.

Bref ça aurait même du planté des le departs....un coup de chance que ça ai fonctionné...Il me suffit donc de rajouter 2 octets a mon allocatememory et le problème a été réglé... Merci a ceux qui ont prit le temps de me lire et désolé de vous avoir fait perdre du temps.... :oops:


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 2 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye