Page 1 sur 2

Longueur d'une phrase avec des Chr(0)

Publié : jeu. 16/juil./2009 13:47
par Kwai chang caine
Bonjour à tous

Alors voila...j'me suis encore mis dans la "oumpha" :?
Toujours dans l'analyse de ce qui sort du compilateur de ce "cher" VB.
J'ai découvert que "pour une fois"' ce cher bilou, il a décidé de pas faire comme les autres quand a la compilation des valeurs de variables en dur.

Kcc y s'explique.....

Quand je regarde un exe avec notepad, qu'est ce que je "m'appercois-je" ???
Si j'ai mis un :

Code : Tout sélectionner

a$ = "Kcc y met son groin partout"
Et ben notre magique PB il ecrit "Kcc y met son groin partout" dans l'exe et c'est donc facile de le retrouver.
Il est pas pretentieux le PB, y touche pas à l'oeuvre de KCC, il respecte le copyright :D

Mais passons à ce "cher" VB......et ben bilou, y fait une grosse crotte avec le copyright de KCC :?
Et en plus le sale, y s'assoit dessus :twisted:

Lui il ecrit "K" + chr(0) + "c" + chr(0) ........"et de c'est les tera"
Donc ce profanateur de code, y rajoute un chr(0) entre chaque caractere.
Surement encore une histoire d'UNICODE, enfin je pense.

Bref KCC y se retrouve avec cette phrase moitié texte moitié chr(0)
Et y s'en voit drolement parce qu'il veut ecrire a la place de cette phrase une autre phrase.
Comme les super hackers qui patchent les exe :D

Sauf que KCC.....c'est "BurnecKer"...une nouvelle race de Hacker car ce sont les seuls qui craquent leur propres programmes dont ils ont le code source :lol:

Donc ma question est....car je suis sur que j'ai été aussi clair que la vase d'un etang qui a pas été curé depuis 10 ans :oops:

Si j'ai la phrase

Code : Tout sélectionner

"X" + chr(0) + "X" + Chr(0) + "X" + Chr(0)
Ecrite dans mon exe, avec quoi je peux ecrire dedans, pour la remplacer par :

Code : Tout sélectionner

"K" + chr(0) + "C" + Chr(0) + "C" + Chr(0) 


Voici le petit code que j'ai fait, mais ça coince tout de suite, car le LEN(Phrase) y s'arrette au premier chr(0) et donc me compte que 1 caractere :?
En fait j'etais parti du super genial code du non moins super genial SOLDAT.....
Mais j'lai tellement esquinté...que meme le soldat apres 5 guerres y serait en meilleur etat :oops:

Code : Tout sélectionner

Phrase.s = "K" + Chr(0) + "C" + Chr(0) + "C" + Chr(0)
LongueurPhrase = Len(Phrase)
Mem = AllocateMemory(6)

If OpenFile(0, "Exe.exe")

 ReadData(0, Mem, 6) 
     
 If Not CompareMemory(@Phrase, Mem, LongueurPhrase)
  FileSeek(0, Loc(0) - LongueurPhrase)
  WriteData(0, @Phrase, LongueurPhrase) 
 EndIf
     
EndIf
Merci de votre aide
Et bonne journée

Publié : jeu. 16/juil./2009 13:55
par Flype
coucou,

et, au cas où, avec StringByteLength(string.s, #PB_Unicode)

:?:


(tu vois je suis toujours là :twisted: )

Publié : jeu. 16/juil./2009 14:38
par Kwai chang caine
Oouuuaaaahhh !!!! mon roi FLIPOUNET 1er 8O 8)

Tu peux pas savoir ce que tu me fais plaisir, de me repondre comme dans le temps 8)
Effectivement tel un dieu tu est de nouveau la, une main sur le clavier et l'autre sur le rebord de mon berceau, pour surveiller d'un oeil bienfaiteur ton humble et bien modeste serviteur :D

StringByteLength.....mais d'ou tu le sort encore celui la :?
Je fais F1 et pouf ...il apparait, a croire que le CHM il a changé entre le temps que j'ai passé des heures a regarder et celui de ta reponse :oops:

Bon je vais de ce pas, le dire a ma maman.....non ..ça c'etait avant ...je vais de ce pas essayer :D

Publié : jeu. 16/juil./2009 14:50
par Kwai chang caine
Bon me rev"l'a....

Alors j'ai fait "tout ça comme tu m'as dit" :D

Mais il est "grolement mechant" ce LEN truc chouette, y veux pas me donner 6

Image

Code : Tout sélectionner

Phrase.s = "K" + Chr(0) + "C" + Chr(0) + "C" + Chr(0)
Debug StringByteLength(Phrase, #PB_Unicode)
Reponse:

Publié : jeu. 16/juil./2009 14:55
par Backup
Kwai chang caine a écrit :Bon me rev"l'a....

Code : Tout sélectionner

Phrase.s = "K" + Chr(0) + "C" + Chr(0) + "C" + Chr(0)
Debug StringByteLength(Phrase, #PB_Unicode)
Reponse:
normal si tu debug phrase.s tu n'aura que "K" !!

tu ne peux pas y arriver comme ça !!

la seul soluce est d'utiliser FileSeek(#Fichier, Position.q)
avec ça tu saute les Chr(0)
pour ne lire qu'une valeur sur 2 dans ton fichier !! :)
et ainsi refabriquer un fichier Saint ! :)

Publié : jeu. 16/juil./2009 15:03
par Kwai chang caine
Bonjour DOBRO

A ouaih !!!!!
C'est comme dans la vie alors !!!!!
C'est le Q qui fait toute la difference :D

En fait si j'ai bien compris, Q lit 2 octets ???? :roll:
Et il saute donc ce Chr(0) d'UNICODE

J'ai vérifié....si je compile en UNICODE ....PB y sort la meme "scata" que VB.
Mais heureusement, par defaut PB il est pas unicode

Merci DOBRO 8)

Publié : jeu. 16/juil./2009 15:05
par Backup
.................

Publié : jeu. 16/juil./2009 15:24
par Geo Trouvpatou
Salut.

Code : Tout sélectionner

Phrase.s = Chr(34) + "K" + Chr(34) + " + Chr(0) + " + Chr(34) + "C" + Chr(34) + " + Chr(0) + " + Chr(34) + "C" + Chr(34)

Debug Phrase
Phrase = RemoveString(Phrase, " + Chr(0) + ")
Phrase = RemoveString(Phrase, Chr(34))
Debug Phrase

Debug StringByteLength(Phrase, #PB_Unicode)
On obtient 6, après je sais pas si ce truc t'avance :lol: .

Bye.

Publié : jeu. 16/juil./2009 15:41
par Backup
j'ai corrigé mon code ci dessus , c'etait n'imp :lol:

Publié : jeu. 16/juil./2009 15:47
par Kwai chang caine
Merci DOBRO,

J'ai modifié ton code car il voulais pas lire le fichier et y'avais une petite erreur dans le Readstring
Mais à part ça je me retrouve avec un fichier de 2 mega pour un fichier de depart de 204 ko
J'ai du merder queque part :roll:

Par contre j'ai une question ????
Le Chr(0) en UNICODE il est devant ou derriere ???

Code : Tout sélectionner

lettre$ = "E"
file$ = OpenFileRequester("Select a file","","Text (.txt)|*.txt|All files (*.*)|*.*",0) 

If file$ 
  
  If ReadFile(0, file$) 
    OpenFile(2,"c:\fichier_modifie.txt") ; le fichier de sauvegarde 
    While Eof(0) = #False                      ;temps que le fichier est pas fini 
      FileSeek(0, Pos.q)              ; place le pointeur au bon endroit 
      lettre$=ReadString(0) ; lit le caractere du fichier 1 
      WriteString(2,lettre$) ; ecrit ce caractere dans le fichier de sauvegarde 
      Pos=Pos+2 ; on saut le chr(0) 
    Wend 
    ; on a fini 
  EndIf 
  CloseFile(0) 
  CloseFile(2) 
EndIf 
@Geotrouvepatout
Je me demande si y compte pas les guillements ton code :D

Publié : jeu. 16/juil./2009 15:48
par Kwai chang caine
On a posté en meme temps.
J'essaie le nouveau :D

Publié : jeu. 16/juil./2009 15:53
par Kwai chang caine
Bah cette fois....c'est mieux.
Mais mon fichier original passe de 204 ko a 28 ko.
Je crois que tu viens d'inventer un algorythme de compression de fichier encore meilleur que WINRAR :D

Et au fait ce Chr(0) il est devant ou derriere ???? :roll:

Publié : jeu. 16/juil./2009 15:54
par Backup
arg !! retest là !!! :D c'est bon !! :)

j'ai mis une procedure de relecture

j'utilise readbyte , au lieu de string ;)


en principe le chr(0) est derriere ... mais bon :lol:

Publié : jeu. 16/juil./2009 16:03
par Kwai chang caine
Bah j'y comprend rien...
Je divise encore par deux le nouveaux fichier
Ce serait pas parce que l'on avance de 2 par 2 et que peut etre on reecris pas deux caracteres ??? :roll:

Publié : jeu. 16/juil./2009 16:11
par Backup
Kwai chang caine a écrit :Bah j'y comprend rien...
Je divise encore par deux le nouveaux fichier
Ce serait pas parce que l'on avance de 2 par 2 et que peut etre on reecris pas deux caracteres ??? :roll:
ben si !! on retire les chr(0) :)

"fichier_modifie.txt" est la version sans chr(0) de ton fichier d'origine :)

tu peux reecrire ce que tu veux dedans
et faire l'operation inverse (réinclure les chr(0) si tu veux ;))

meme si je vois pas a quoi ils servent les chr(0) ;)