Page 1 sur 2
[résolu] Chr(0) inconnu au bataillon ?
Publié : ven. 14/mars/2008 11:30
par DarkVader
Bonjour,
Voilà quelques temps que je rame pour finalement découvrir que le chr(0) est royalement ignoré d'un string dumoins avec len et stringbytelength !!!
exemple
qui retourne 19 - plutôt gênant.
Quelle solution utilisez-vous habituellement pour contourner ce bug ?
N'ayant pas fait le tour de toutes les fonctions de chaines,
j'imagine que le comportement est identique avec toute (CountString, FindString etc.) ?
Edit:
CountString, FindString : après vérification même combat
PS: Version 4.10 utilisée
Publié : ven. 14/mars/2008 14:15
par gnozal
Debug affiche 19 ?!
Chez moi c'est 9, ce qui me parait correct.
Code : Tout sélectionner
Debug Len("123456789" + Chr(0) + "1234567890")
; PB4.10
; --> 9 en mode ANSI
; --> 9 en mode Unicode
Publié : ven. 14/mars/2008 14:34
par DarkVader
Code : Tout sélectionner
sMsg.s="123456789"+chr(0)
sMsg=sMsg+"1234567890"
Debug Len(sMsg)
Résultat 19 - Sous VB le résultat eut été 20.
Il n'en demeure pas moins qu'un string ne peut comporter de chr(0).
J'ai bien trouvé
une solution en Asm mais qui malheureusement ne solutionne pas mon problème puisqu'elle filtre également les chr(0)
Publié : ven. 14/mars/2008 14:53
par djes
Oui, ce caractère sert à définir la fin d'une chaîne justement. Il ne devrait donc pas être utilisé. De quoi as-tu besoin au juste, juste d'une fonction pour savoir la taille d'une chaîne?
Publié : ven. 14/mars/2008 14:54
par Anonyme
C'est logique , chr(0) sert à délimité les strings. je crois que c'est écrit quelque part dans la doc.
Code : Tout sélectionner
Debug Len(Chr(0)+"123456789" + Chr(0) + "1234567890")
; PB4.10
; --> 0 en mode ANSI
; --> 0 en mode Unicode
Publié : ven. 14/mars/2008 14:59
par DarkVader
J'ai des chaines contenant des chr(0) à traiter et j'aimerais en connaître la taille.
J'imagine que c'est possible sinon mon exemple retournerait 9 et non 19.
Publié : ven. 14/mars/2008 15:31
par Anonyme
T'es sous purebasic ? fait claqué du code.
Edit: C'est quel code ascii qui te sert à délimité les chaine ?
Publié : ven. 14/mars/2008 15:36
par gnozal
Purebasic utilise des chaînes de type ASCIIZ en mode ANSI, UTF-8 en mode unicode. Autrement dit le zéro est un signal de fin de chaîne.
VB, Powerbasic utilisent des chaînes de type BSTR (binary string), qui supportent des chr(0).
En Purebasic, il faut utiliser des zones mémoires [*Buffer = AllocateMemory(BufferSize)] pour manipuler des données binaires [<> texte].
Publié : ven. 14/mars/2008 15:40
par DarkVader
Je doute que cela aide, je reçois la chaine via un programme extérieur %)
Code : Tout sélectionner
Proceduredll maProc($sMsg)
lMsg.l=len($sMsg) ;ne fonctionne pas si $sMsg contient des caractères nuls qui sont décontés
;.../..
endProcedure
Publié : ven. 14/mars/2008 15:41
par DarkVader
gnozal a écrit :Purebasic utilise des chaînes de type ASCIIZ en mode ANSI, UTF-8 en mode unicode. Autrement dit le zéro est un signal de fin de chaîne.
VB, Powerbasic utilisent des chaînes de type BSTR (binary string), qui supportent des chr(0).
En Purebasic, il faut utiliser des zones mémoires [*Buffer = AllocateMemory(BufferSize)] pour manipuler des données binaires [<> texte].
et comment je connais Buffersize ?
Publié : ven. 14/mars/2008 15:54
par gnozal
DarkVader a écrit :gnozal a écrit :Purebasic utilise des chaînes de type ASCIIZ en mode ANSI, UTF-8 en mode unicode. Autrement dit le zéro est un signal de fin de chaîne.
VB, Powerbasic utilisent des chaînes de type BSTR (binary string), qui supportent des chr(0).
En Purebasic, il faut utiliser des zones mémoires [*Buffer = AllocateMemory(BufferSize)] pour manipuler des données binaires [<> texte].
et comment je connais Buffersize ?
C'est la taille des données stockées (en octets).
Publié : ven. 14/mars/2008 16:12
par DarkVader
gnozal a écrit :
C'est la taille des données stockées (en octets).
Oui mais comment je définis la valeur de BufferSize suffisant
si je ne connais pas la taille de la chaine transmise ?
Publié : ven. 14/mars/2008 16:20
par djes
Normalement tu devrais recevoir un pointeur...
Publié : ven. 14/mars/2008 16:32
par gnozal
DarkVader a écrit :gnozal a écrit :
C'est la taille des données stockées (en octets).
Oui mais comment je définis la valeur de BufferSize suffisant
si je ne connais pas la taille de la chaine transmise ?
Tu peux allouer une quantité au départ puis l'augmenter si nécessaire avec ReAllocateMemory().
Publié : ven. 14/mars/2008 18:26
par nico
Avec un pointeur, tu remplaces tous les 0 par un caractère, genre "|" et après tu gères ta chaine avec les commandes de PureBasic.