|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() Inscription : août 2003 Messages : 202 ![]() |
Bonjour à tous,
J'utilise Delphi 2010 et je reçois d'une socket IP des données dont la longueur est d'environ 20 000 caractères UTF8. J'ai déclaré une variable XLMTextIN: RawByteString; Ensuite sur l'évevenement SocketServerClientRead je récupère les données reçues sur la socket XLMTextIN := Socket.ReceiveText; Pour info, XLMTextIN = '<?xml version="1.0" encoding="utf-8"?>.... si je fais un pos('utf-8', XLMTextIN) ou ansipos('utf-8', XLMTextIN) la valeur renvoyée est toujours 0. Est ce parce que la longueur de XLMTextIN dépasse les 256 caractères ? Ou alors est ce pour une autre raison ? Merci d'avance pour vos réponses, Wilco |
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() ![]() Paul TOTHFreelance Inscription : novembre 2002 Messages : 4 544 ![]() |
je ne sais pas où est l'erreur, mais pas dans la limite de taille, les string ne sont plus limité à 255 caractères depuis Delphi 2
__________________
Developpez.com: Mes articles, forum FlashPascal Entreprise: Execute SARL Produits : UPnP, RemoteOffice, FlashPascal Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5% |
|
00
|
|
|
#3 |
|
Expert Confirmé
![]() ![]() |
Bonjour,Il faudrait peut être convertir XMLTextIN en string avant de faire le test ?
__________________
Philippe. |
|
|
10
|
|
|
#4 | |||||
|
Expert Confirmé Sénior
![]() Développeur C++\Delphi Inscription : juillet 2006 Messages : 9 261 ![]() |
RawByteString est un type brut mais reste une AnsiString d'un point de vue mémoire
je pense que c'est plus lié à un problème de conversion d'encodage ! Quel variante utilise-t-il de Pos utilise-t-il ? Citation:
du coup il doit avoir des difficultés pour choisir entre la variante 2 UnicodeString ou 2 RawByteString essaye ceci Code :
As-tu essayé un ReceiveBuf dans TByteDynArray temporaire recopié ensuite dans un TMemoryStream pour finalement effectué un TXMLDocument LoadFromStream ? Pense aussi que tu ne recevra jamais les 20000 caractères d'un coup mais découpé en lot de 8Ko, il te faudra donc accumuler le XML dans le TMemoryStream, une fois complet, tu pourras le lire
__________________
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y ! Attention Troll Méchant ! ![]() "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer ! L'ignorance n'excuse pas la médiocrité ! L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde) Il faut avoir le courage de se tromper et d'apprendre de ses erreurs Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié ! |
|||||
|
|
00
|
|
|
#5 |
![]() ![]() Inscription : septembre 2008 Messages : 2 886 ![]() |
Il faudrait déjà s'assurer qu'il n'y a pas de #0 dans la chaîne. Ceci permettrait de le contrôler :
Code :
ShowMessage(PAnsiChar(XLMTextIN) +#13 +IntToStr(Length(XLMTextIN))); |
|
|
00
|
|
|
#6 |
|
Membre du Club
![]() Inscription : août 2003 Messages : 202 ![]() |
Merci à tous pour vos réponses ... J'ai peut être une explication sur le problème que je rencontre.
J'utilise un TServerSocket et lorque la socket reçoit environ 20Ko de données, effectivement elle les reçoit en plusieurs paquets. J'ai mis un point d'arrêt sur l'évènement OnRead de la socket. Lors du 1er arrêt, si je consulte la variable XLMTextIN = Socket.ReceiveText; elle affiche bien '<?xml version="1.0" encoding="utf-8"?>.. je vois donc son contenu la seconde variable est : x := ansipos('utf-8', XLMTextIN); A ce moment, x = 0 ( ce qui est perturbant car il devrait afficher 31 ) Et ce n'est qu'au 4ème passage sur le point d'arrêt que x = 31. Comme le dit justement Shail, les données n'arrivent pas en une seule fois et il semblerait que la fonction pos et/ou ansipos ne renvoie pas la bonne valeur tant que l'intégralité des données aient été reçues. C'est étrange car lors de chaque passage au point d'arrêt, le contenu de la variable XLMTextIN, qui reçoit les données de la socket, est bien visible. Au final j'arrive à faire fonctionner ce programme mais le débogage n'est pas facilité en raison du comportement soit de Delphi soit de mon application. Merci encore une fois à tous ceux qui ont apporté leur contribution à ce post. Wilco |
|
|
00
|
|
|
#7 | |
![]() ![]() Inscription : septembre 2008 Messages : 2 886 ![]() |
Je ne fais que lire l'aide :
Citation:
|
|
|
|
00
|
|
|
#8 | ||||
|
Expert Confirmé Sénior
![]() ![]() Paul TOTHFreelance Inscription : novembre 2002 Messages : 4 544 ![]() |
RawByteString ne perd pas réellement de données, il perd sa page de code, du code le caractère #145 n'est pas forcément le caractère "æ", mais #65 sera toujours un "A"
pour identifier clairement le problème en mettant de côté le debugueur j'utilise souvent une méthode très efficace: Code :
ensuite on peut aller plus loin Code :
__________________
Developpez.com: Mes articles, forum FlashPascal Entreprise: Execute SARL Produits : UPnP, RemoteOffice, FlashPascal Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5% |
||||
|
00
|
Copyright © 2000-2013 - www.developpez.com