Page 1 sur 1
XOR en string (pas le sherif ok ?!!)
Publié : jeu. 04/mai/2006 4:50
par SPH
Y a t'il moyen d'appliquer un XOR sur un string entier en un coup ?
Appliqué a partir d'un caractere ?
Appliqué a partir d'un autre string de meme longueur ???

Publié : jeu. 04/mai/2006 16:20
par Dorian
Apparemment non faut faire ta procédure à la main ^^
Si c'est par rapport au code ascii c'est simple à faire ^^
[EDIT]
La voici grâce au code ascii :
Code : Tout sélectionner
ProcedureDLL.s StrXor(a.s, b.s)
If Len(a) <> Len(b)
ProcedureReturn ""
EndIf
Result.s = ""
For x = 1 To Len(a)
Result = Result + Chr((Asc(Mid(a, x, 1)) ! Asc(Mid(b, x, 1))))
Next x
ProcedureReturn Result
EndProcedure
Debug StrXor("azerty", "qsdfgh")
Si c'est pas sa bah il faudrait nous dire par rapport à quel code pour un caractère (ascii ou ????) tu veux. Bon dsl si je suis pas compréhansible ^^
Publié : jeu. 04/mai/2006 16:28
par SPH
un XOR, c'est un changement de certains bits
Par exemple, %11110000 XOR %00000001 donne %11110001
Sinon, la routine, je sais la faire mais je cherchais a savoir si une technique permettait un XOR sur toute une chaine.
Publié : jeu. 04/mai/2006 16:39
par Dorian
Merci mais en terminal d'electronique je sais ce qu'est une XOr ^^
En faite j'ai pas tout capter ton histoire de sur toute la chaîne ??? Mon code fait un Xor du code ascii des 2 caractères d'une même "colonne". Mais j'aimerais que explique un peu plus ce que tu veux car là je nage ^^
Publié : jeu. 04/mai/2006 16:59
par SPH
Dorian a écrit :Merci mais en terminal d'electronique je sais ce qu'est une XOr ^^
En faite j'ai pas tout capter ton histoire de sur toute la chaîne ??? Mon code fait un Xor du code ascii des 2 caractères d'une même "colonne". Mais j'aimerais que explique un peu plus ce que tu veux car là je nage ^^
Imagine :
a$="abcdefgh"
et
b$="12112310"
A$ va etre "écraXORé" par b$ dans la mesure où :
le"a" (dans a$) va etre XORé par les bits representant le "1" (dans b$)
le"b" (dans a$) va etre XORé par les bits representant le "2" (dans b$)
le"c" (dans a$) va etre XORé par les bits representant le "1" (dans b$)
le"d" (dans a$) va etre XORé par les bits representant le "1" (dans b$)
le"e" (dans a$) va etre XORé par les bits representant le "2" (dans b$)
le"f" (dans a$) va etre XORé par les bits representant le "3" (dans b$)
le"g" (dans a$) va etre XORé par les bits representant le "1" (dans b$)
le"h" (dans a$) va etre XORé par les bits representant le "0" (dans b$)
Je cherchais une seule instruction qui fasse tout cela d'un coup

Publié : jeu. 04/mai/2006 17:21
par Dorian
bah c'est ce que fait mon code ^^ car il me semble pas que l'on puisse le faire avec pb. J'ai testé avec pb de la même manière que pour un nombre et sa n'a pas marché sous la v3.94

Publié : jeu. 04/mai/2006 20:23
par LeCyb
Bien sûr que l'on peut faire ça avec PB
Pour faire cela, on commence par allouer un espace mémoire, puis un petit PokeS pour placer le texte dans le buffer.
Ensuite il suffit de parcourir le buffer pour faire le Xor.
Code : Tout sélectionner
Structure Bytes
b.b[0]
EndStructure
s1.s = "12345"
s2.s = "abcde"
*buffer1.Bytes = AllocateMemory(Len(s1))
PokeS(*buffer1,s1)
*buffer2.Bytes = AllocateMemory(Len(s2))
PokeS(*buffer2,s2)
If Len(s1) > Len(s2)
fin = Len(s2)
Else
fin = Len(s1)
EndIf
For i = 0 To fin - 1
*buffer1\b[i] = *buffer1\b[i] ! *buffer2\b[i]
Next
Debug PeekS(*buffer1)
Debug PeekS(*buffer2)
Publié : jeu. 04/mai/2006 20:42
par SPH
Merci LeCyb, j'analyserais cela tres tres bientot dans les moindres details...
Publié : jeu. 04/mai/2006 20:44
par Dorian
bah jpéfère ma fontion StrXor() ^^ elle est plus courte ^^.
En plus je sais qu'on peu le faire mais il demandait une façon qui en gros fait une ligne ^^. Et là c'est pas possible ^^
Publié : jeu. 04/mai/2006 23:23
par Flype
lol, une ligne peut etre pas mais 5 oui :
Code : Tout sélectionner
ProcedureDLL.s StrXor(a.s, b.s)
Protected *a.Byte=@a, *b.Byte=@b
While *a\b And *b\b : *a\b!*b\b : *a+1 : *b+1 : Wend
ProcedureReturn a
EndProcedure
un peu obscur mais çà marche

Publié : jeu. 04/mai/2006 23:40
par SPH
oui, d'autant qu'en procedure, ca permet de faire l'operation en une instruction...
Oui, c'est un peu obscure mais le brouillard se dissipira quand j'aurais le nez dedans.

Publié : mar. 09/mai/2006 12:46
par SPH
bon, je m'y suis penché et c'est beaucoup trop obscure =)
De plus, le WHILE WEND que je n'avais pas vu me fait plutot preferer ma methode. Mais c'est sympa d'avoir essayer quand meme (j'ai donc confirmation qu'il n'existe rien de simple pour faire ca)
Publié : mar. 09/mai/2006 14:01
par Dorian
bah mon code n'est pas simple ?
Dès que TailBite sortira pour la V4 tu n'aura plus qu'une ligne ^^
Publié : mar. 09/mai/2006 14:50
par Flype
c'est vous qui voyez mais ma fonction est jusqu'à 5x plus rapide chez moi pour le même résultat.
ce qui n'est pas négligeable du tout pour ce type d'opération.
et ma fonction n'est pas si obscure, je viens de la commentée ci dessous.
il s'agit juste de manipuler des chaines avec des pointeurs comme dr dri d'ailleurs.
( debugger désactivé ! )
Code : Tout sélectionner
Structure Bytes
b.b[0]
EndStructure
ProcedureDLL.s StrXor0(a.s, b.s) ; dorian (modifié)
Protected result.s
Protected lenA.l = Len(a)
Protected lenB.l = Len(b)
If lenA > lenB
For i=1 To lenB : result + Chr((Asc(Mid(a, i, 1)) ! Asc(Mid(b, i, 1)))) : Next
Else
For i=1 To lenA : result + Chr((Asc(Mid(a, i, 1)) ! Asc(Mid(b, i, 1)))) : Next
EndIf
ProcedureReturn result
EndProcedure
ProcedureDLL.s StrXor1(a.s, b.s) ; dr dri (modifié)
Protected *a.Bytes = @a, lenA.l = Len(a)
Protected *b.Bytes = @b, lenB.l = Len(b)
If lenA > lenB
For i=0 To lenB-1 : *a\b[i] ! *b\b[i] : Next
Else
For i=0 To lenA-1 : *a\b[i] ! *b\b[i] : Next
EndIf
ProcedureReturn a
EndProcedure
ProcedureDLL.s StrXor2(a.s, b.s) ; flype
Protected *a.Byte = @a ; Pointeur sur le premier caractère de a.s
Protected *b.Byte = @b ; Pointeur sur le premier caractère de b.s
While *a\b And *b\b ; Tant que *a et *b sont différents de Chr(0)
*a\b ! *b\b ; XOrisation du caractère en cours dans a.s
*a+1 : *b+1 ; Incrémente les pointeurs pour obtenir le caractère suivant
Wend ; Fin puisque *a ou *b est égal à Chr(0)
ProcedureReturn a ; Retourne la chaîne XOrisée
EndProcedure
;------------------------------------
n.l = 500000
a.s = "dorian,dri,flype"
b.s = "0123456789ABCDEF"
;------------------------------------
t0 = ElapsedMilliseconds()
For i = 0 To n
r0.s = StrXor0(a, b)
Next
t0 = ElapsedMilliseconds() - t0
;------------------------------------
t1 = ElapsedMilliseconds()
For i = 0 To n
r1.s = StrXor1(a, b)
Next
t1 = ElapsedMilliseconds() - t1
;------------------------------------
t2 = ElapsedMilliseconds()
For i = 0 To n
r2.s = StrXor2(a, b)
Next
t2 = ElapsedMilliseconds() - t2
;------------------------------------
res.s
res + a + " XOr " + b + #LF$ + #LF$
res + r0 + " : " + Str(t0) + "ms" + #LF$
res + r1 + " : " + Str(t1) + "ms" + #LF$
res + r2 + " : " + Str(t2) + "ms" + #LF$
MessageRequester("Résultat", res)
;------------------------------------
Publié : mar. 09/mai/2006 15:46
par SPH
Je vais donc me repenchez la dessus (et apprendre a utiliser les pointeurs. Ce sera la premiere fois)