XOR en string (pas le sherif ok ?!!)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

XOR en string (pas le sherif ok ?!!)

Message 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 ??? :?: :?:
Dorian
Messages : 489
Inscription : mar. 15/mars/2005 15:33

Message 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 ^^
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Message 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.
Dorian
Messages : 489
Inscription : mar. 15/mars/2005 15:33

Message 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 ^^
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Message 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 :wink:
Dorian
Messages : 489
Inscription : mar. 15/mars/2005 15:33

Message 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 :wink:
LeCyb
Messages : 273
Inscription : dim. 26/déc./2004 20:49

Message 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)
Vive le thread-safe !
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

Merci LeCyb, j'analyserais cela tres tres bientot dans les moindres details...

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Dorian
Messages : 489
Inscription : mar. 15/mars/2005 15:33

Message 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 ^^
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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 :D
Image
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Message 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. :P
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Message 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)

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Dorian
Messages : 489
Inscription : mar. 15/mars/2005 15:33

Message par Dorian »

bah mon code n'est pas simple ?

Dès que TailBite sortira pour la V4 tu n'aura plus qu'une ligne ^^
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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)
;------------------------------------
Image
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

Je vais donc me repenchez la dessus (et apprendre a utiliser les pointeurs. Ce sera la premiere fois)

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Répondre