![]() |
Recorrer un pchar
Tengo un buffer de bytes guardado en un pchar (de una aplicación cliente servidor, que envía este buffer como mensajes divididos en trozos y con cabecera). Me gustaria poder recorrerlo, hacer como cuando se hace delete en un string (de una posicion a otra que yo quiera), pero no entiendo el funcionamiento de pchar y me vuelvo loco. Por favor, alguien puede explicarme cómo lo hago? Cómo cojo los bytes que me interesan? (los de la cabecera al recibir) y borrarlos luego para quedarme sólo con el buffer de bytes de datos correspondientes al archivo que he enviado?
Muchas gracias. |
Un PChar es un puntero a un caracter, se utilizan para manejar cadenas terminadas en caracter nulo como en C. El "truco" esta es mover el puntero por la cadena, adelante o atras segun convenga.
Por ejemplo:
Es solo un ejemplo de como recorrer la cadena, para copiar el contenido de un PChar en un String hay metodos mas eficaces:
Y algo parecido a lo que quieres hacer tu, metemos en una misma porcion de memoria un texto y un integer, y luego los volvemos a separar.
Son varios ejemplos de como tratar con PChar, revisa tanbien la ayuda de delphi, encontraras un monton de funciones para tratar con este tipo de cadenas de texto. ;) Y si no encuentras lo que buscas vuelve por aqui haber que podemos hacer. |
Quizás fuera más facil pasar el Pchar a String o a un TStringList, mediante TStringList.DelimitedText puedes partir en trozos la cadena (por espacios, por un punto y coma, por una coma, etc).
Al pasarlo a un String, puedes usar la archifamosa función "Pos" o "copy" para copiar los caracteres. Saludos |
Si es para un solo caracter te puede valer un índice para recorrer la variable. Si extraes más de uno a la vez, quizás con Copy puedas hacerlo, en cuanto a explicaciones las que te da Seoane y Lepe son amplias y doctas. Un Saludo. |
Gracias!!!!
Gracias a todos!!! Ya voy viendo la luz al final del tunel....lo mismo a medio camino debo hacer otra paradita por aqui...
:) Gracias!!! |
Ten en cuenta que hemos inaugurado hace poco el Foro "La Taberna", lugar apto para paraditas y lo que salga, en donde te puedes poner de bebida virtual hasta los tuétanos, es gratis y no afecta a la conducción.
Un Saludo. |
Duda sobre StrCopy
Hola,
no se por qué me da error al poner: StrCopy(bufferAux,(formatFloat('0000',length(bufferAux)) + 't')); Da "incompatible types string and Pchar". |
Pues el error lo dice todo ;) . Estas intentando usar un string como si fuera un PChar, que se puede, pero hay que indicarselo al compilador que si no se atraganta :D , asi que debemos hacer el conveniente typecast.
|
mas sobre pchar
es verdad!!! gracias...
No os lo vais a creer pero sigo teniendo problemas Seoane lo que me has recomendado me ha parecido genial pero ahora estoy intentando añadir un pchar a otro de la siguiente manera y no lo consigo:
En BufferAux solo tengo el valor de la cabecera, pero no me añade el de buffer. Lo he comprobado paso a paso y en buffer si mete contenido...me estoy montando unos lios...Perdonar por ser tan pesao |
Creo que el problema debe de estar aqui:
Date cuenta que sizeof(buffer) siempre valdra 4 ya que ese es el tamaño de un PChar (si buffer es un PChar que tampoco lo aclaras), y no tiene nada que ver con el contenido de la memoria al que apunta ese puntero. Pero la verdad es que ya me estoy empezando a perder con tu codigo :) No estoy seguro de lo que estas intentando hacer pero tiene que haber alguna manera mas sencilla de hacerlo. |
aclaración
Perdona..esque no me aclaro ni yo.
Quiero mandar un fichero de un pc a otro por medio de sockets. Eso es fácil. Me exigen que no se envíe el fichero entero si no a trozos. He conseguido mandarlos a trozos(me ha costado pero lo logré...) y ahora lo que quiero es incluir en cada paquete que mando una cabecera con tamaño de paquete y tipo...(En realidad no sirve para nada pero lo tengo que hacer) vamos que tengo que mantar paquetes que tengan: -tamaño -tipo -datos cuando se reciban estos paquetes tengo que extraer la cabecera y incluir los datos en el fichero... Y eso es todo... He trabajado otras veces con sockets pero siempre he mandado texto y trabajaba bastante bien, pero como tengo que poder mandar ficheros de todo tipo.. Otros compañeros míos lo han hecho con Java mandando un objeto trama con los campos de tamaño...y bytes y les ha salido, pero yo me he empeñado en hacerlo con delphi.:mad: Me esta agobiando un montón esto, gracias por echarme una mano de verdad...(: por cierto, el buffer...anteriormente hago getmen(buffer,1024) |
Se me ocurre que puedes usar records para hacer lo que te pidieron. Me explico, primero declaras un tipo de record que sera el que utilices para enviar y recibir los trozos:
Luego solo tienes que usar ese paquete durante la transmision:
Y durante la recepcion
El unico problema es que si el ultimo paquete no lo llenamos por completo, estaremos enviando mas bytes de los necesarios, pero como tambien enviamos el tamaño ese no seria un problema. Y es enormemente mas sencillo que andar haciendo malabares con punteros :) ¿que te parece? |
Gracias
Gracias!!!!!!!!! :) nunca he trabajado con eso (soy muyyyy novato):o
Me parece que lo que me has dicho va a ser la solución a mis males... ya me temía yo que me estaba complicando demasiado la vida... Gracias, gracias de verdad... voy a ponerme a ello inmediatamente...:D Ni te imaginas el favor que me acabas de hacer!!!!!!!!!!!! |
:D No podiamos consentir que tus compañeros lo hiceran en Java y tu no lo hiceras en Delphi, por favor ... :cool:
|
Más consultas sobre el tema
jejeje...delphi al poder!!!:D
He utilizado lo de los record (que buena idea!:) ) y normalmente me va bien sobre todo en los ficheros jpg pequeños... Los word los estropea...no se. Vamos que a veces me va bien y a veces mal...Esta tarde cuando llegue a mi casa añado el código. Yo creeo que envíar, los envía bien...el problema creo que es al recibirlos porque a lo mejor no llegan completos, no sé...:confused: Yo cuando he utilizado socket para mandar texto lo iba encolando en un string, si la variable cola(de tipo string) era mayor que 2(tamaño del campo de tamaño de mensaje) cojía el tamaño (lo pasaba a entero). Luego comparaba el tamaño de la cola de mensajes con el campo de tamaño y si era mayor o igual extraía el mensaje y lo borraba de la cola... y de esta manera aseguraba que los mensajes llegaran completos Bueno eso hacía e iba muy bien. No se si será necesario encolar los bytes...(no tengo ni idea de como encolar, recoger en mi estructura y eliminar bytes de una cola de bytes pero bueno...) Bueno esta tarde os lo cuento mejor con código incluido a ver que os parece...;) |
No tengo mucha experiencia con los componentes que usas (TClientSocket y TServerSocket, corrigeme si me equivoco), ni si quiera lo tengo en la paleta de componentes :D Pero he estado haciendo unas pruebas y parece que no funciona mal del todo:
He utilizado el tipo NonBlocking aunque no me gusta este tipo de sockets, mas que nada porque me resultaba mas sencillo, ¿que tipo usas tu? Me gustaria echarle un vistazo a tu codigo. |
Llevo toda la tarde sin internet
Gracias Seoane:) , ahora te paso mi código...Perdona, me he tenido que ir a casa de mi primo...me he cambiado de proveedor de internet...y me han tenido sin internet hasta ahora:mad: ... Voy a preparar el código para ponerlo...Si lo quieres todo dime dónde lo subo o dónde te lo mando...
Gracias por la ayuda de verdad...Este año tengo unos compañeros bastante pasotas y no estoy recibiendo ninguna ayuda por parte de ellos...todo lo contrario...es competencia pura... |
Código
Hola Seoane.
Esto no está montado en mi aplicación porque me daba tantos poblemas que lo hice aparte. Está basado en uno que recomendaban en el club en una determinada página (no recuerdo cual). Voy a mirar lo que me has mandado y voy a tratar de montarlo todo en mi apliación, porque aquí por ejemplo mando los ficheros eligiendo el que quiero y en mi aplicación debo hacer que cada cierto tiempo mire a ver cuales han sido modificados, creados o borrados y los envíe al cliente. Una sincroniación de ficheros, todo lo que haga en el servidor debe hacerse en el cliente. En lo que te mando tengo dos socket, uno dedicado a mandar el tamaño del fichero (servidor -> cliente) a enviar y otro que envía el fichero (cliente ->servidor). Lo he hecho así por los problemas que me daba el meter la información en los fragmentos del fichero, pero ahora viendo que funciona lo que me estás aconsejando, voy a unificarlo todo y a emplear sólo un socket (que es cómo me han pedido que lo haga). El código para enviar ficheros es:
El código para recibir el fichero enviado es:
Voy a ponerme a currar como un loco y voy a mirarme bien lo que me has mandado. El código que he puesto a lo mejor está un poco caótico...bueno..voy a ir trabajando y luego te cuento. |
A simple vista me parece que en esta linea te sobra el "-1". El resto parece que esta bien, pero habria que mirarlo mas profundamente. |
Gracias!
Ahora estoy poniéndolo en un solol socket y haciendo que recorra un directorio y mande todos los ficheros que hay en el.
Miraré lo que me has dicho. Cuando complete todo te lo enseño.:) Gracias!!:D |
La franja horaria es GMT +2. Ahora son las 08:55:41. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi