Bug allocatememory en unicode [pb4.20][Résolu]

Archive.
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Bug allocatememory en unicode [pb4.20][Résolu]

Message par Thyphoon »

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 : Tout sélectionner

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

Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

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])
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:
Répondre