TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Diego E. en 16 de Octubre de 2009, 10:07:11

Título: Funcion sprintf
Publicado por: Diego E. en 16 de Octubre de 2009, 10:07:11
Hola grupo, les consulto por lo siguiente:

Estoy utilizando la función sprintf de la siguiente forma

char   bcd[8];
entero_8b = 123;
sprintf(bcd,"%u",entero_8b);

bcd es una matriz de 6 caracteres y entero_8b = 123, luego bcd queda cargada con 123???; necesito formatear de tal forma que los caracteres de la izquierda se rellenen con ceros, ejemplo: 000123.

Otra inquietud: si quisiera rellenar la matriz BCD con un texto, algo así como sprintf(bcd,"%u","texto"); como podría hacerlo

muchas gracias.
Título: Re: Funcion sprintf
Publicado por: RICHI777 en 16 de Octubre de 2009, 10:35:13
Hola,

Citar
necesito formatear de tal forma que los caracteres de la izquierda se rellenen con ceros, ejemplo: 000123.

Código: C
  1. sprintf(bcd,"%06u",entero_8b);

El cero indica el caracter con que queres paddear ( se llama asi este tipo de cosas ) y el número, en este caso 6 indica cual es el largo fijo que va a tener el string resultante.

Citar
Otra inquietud: si quisiera rellenar la matriz BCD con un texto, algo así como sprintf(bcd,"%u","texto"); como podría hacerlo

De dos maneras, simplemente podes strcpy o tambien sprintf

Código: C
  1. strcpy( bcd, "Hola" );
  2. sprintf(bcd,"Hola" );

De mas esta decir que el tamaño del texto tiene que ser menor al largo de bcd - 1

Saludos !
Título: Re: Funcion sprintf
Publicado por: Diego E. en 16 de Octubre de 2009, 12:54:24
RICHI777, era exactamente lo que necesitaba.

mil gracias

saludos
Título: Re: Funcion sprintf
Publicado por: Suky en 16 de Octubre de 2009, 12:56:55
En CCS pulsando F12 se abre la ayuda, colocando printf se muestra la función y al final varios ejemplos. Para la próxima  ;-)


Saludos!
Título: Re: Funcion sprintf
Publicado por: Diego E. en 16 de Octubre de 2009, 14:11:42
Gracias Suky.
Título: Re: Funcion sprintf
Publicado por: dragondgold en 22 de Diciembre de 2010, 12:49:40
Hola aprovecho este post para no abrir otro  :) Estoy teniendo un problema con la funcion sprintf();. Todo funciona correctamente con las variables del tipo FLOAT siempre y cuando no sean menores a 1, por ejemplo si le envío a la función un 0.8 retorna un 0.0008 o un 0.123 depende del caso que use, lo mas aproximado lo he tenido con %f y %g pero realizan una especie de redonde por lo tanto al tener un 0.2 por ejemplo me lo redondean a 0, en el caso de %f me saca un valor que nada que ver, como debería configurar el sprintf()? EL objetivo de poner el numero en la matriz es para presentarlo en un GLCD.

Saludos y gracias!!
Título: Re: Funcion sprintf
Publicado por: Diego E. en 23 de Diciembre de 2010, 09:39:54
Hola amigo, dependiendo como lo formatees te dará estos resultados

int cadena[10];

sprintf(cadena,"%f",0.123456789);       // = 0.12
sprintf(cadena,"%010.2f",0.123456789);    // = 000000.12
sprintf(cadena,"%010.5f",0.123456789);    // = 0000.12345
sprintf(cadena,"%010.8f",0.123456789);    // = 0.12345678

saludos
Título: Re: Funcion sprintf
Publicado por: dragondgold en 23 de Diciembre de 2010, 15:53:25
Gracias Diego E. al parecer el problema no estaba en el sprintf sino en la variable que me quedaba siempre a 0 porque estaba diviendo una variale INT sobre 10 y me daba numero con coma por debajo de 1 y me lo dejaba en 0, lo solucioné colocando (float) delante de la variable:

FLOAT a;
INT b;

a = b / 10      <----- No funciona

a = (FLOAT)b / 10     <------ Funciona

Saludos y gracias!!
Título: Re: Funcion sprintf
Publicado por: tgo.aviña en 02 de Mayo de 2014, 00:38:58
Hola que tal!!

Estoy intentando escribir en un LCD ya logre proyectar caracteres y la pantalla pero quisiera poner manipular el texto durante el programa.
Mi codigo es algo asi.

char letra[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J'};
int x;

for( x = 0; x<20; x++ )
{
   WriteData(letra
}

De esa manera escribo en mi LCD pero quisiera poder modificar el valor de mi variable letra use sprintf de la siguiente manera pero no se si este comentiendo algun error.

sprintf(letra, "Hola");
Título: Re:Funcion sprintf
Publicado por: Rseliman en 05 de Diciembre de 2015, 09:05:19
Hola  Amigos , tengo una duda con esta funcion sprintf , todo bien hasta que me empezo a recortar el string y no se porque ..esto es lo que hago

salida[30]
cliente [15]
counter[15]
cpassword[15]


sprintf(salida,"GET /carpeta123/carpeta12.php?n=%s&numero=%s&passw=%s HTTP/1.0\r\n",&cliente,&counter,&cpasword);
USARTWriteString(salida);
USARTWriteString("Host: ramiro2.com.ar\r\n\r\n");
 

el resultado de esto deberia ser

GET /carpeta123/carpeta12.php?n=2&numero=000&passw=ramiro2 HTTP/1.0 Host: ramiro2.com.ar


y sin embargo me da esto

GET /carpeta123/carpeta12.php?n=2&numero=000& Host: ramiro2.com.ar


los char estan cargados de antemano con 2 , 000 y  ramiro2

lo que hago es pasar una direccion a una pagina web


Alguien me da una mano que no me doy cuenta que es lo que pasa

Muchas gracias a todos
Título: Re:Funcion sprintf
Publicado por: KILLERJC en 05 de Diciembre de 2015, 09:26:25
salida[30]

GET /carpeta123/carpeta12.php?n=2&numero=000&passw=ramiro2 HTTP/1.0

Conta cuantos caracteres tenes, tenes 30 en el "?" inclusive. Ese es un primer error. Acordate que son todos los char + un 0x00. Arregla eso a un buffer de mayor tamaño (68 el minimo para tu ejemplo) y luego se verifica si sigue el problema, para mi estas escribiendo otros datos, por que normalmente las funciones de texto esperan un caracter nulo '\0' para terminar su funcion.

Luego de verlo estoy mas seguro de eso, Si tenes:

salida[30]
cliente [15]

Estos serian 45 caracteres sin contar el 0x00

GET /carpeta123/carpeta12.php?n=2&numero=000&

Hay que ver como se maneja el sprintf por dentro + como esta la RAM en ese momento para verificar el funcionamiento y ver por que se detiene ahi y no sigue "sobrescribiendo" mas datos
Título: Re:Funcion sprintf
Publicado por: Rseliman en 05 de Diciembre de 2015, 09:43:28
Gracias KILLERJC

Me parece que no me da mas la RAM ....verifico  y comento ...no me habia dado cuenta

Mil Gracias



salida[30]

GET /carpeta123/carpeta12.php?n=2&numero=000&passw=ramiro2 HTTP/1.0

Conta cuantos caracteres tenes, tenes 30 en el "?" inclusive. Ese es un primer error. Acordate que son todos los char + un 0x00. Arregla eso a un buffer de mayor tamaño (68 el minimo para tu ejemplo) y luego se verifica si sigue el problema, para mi estas escribiendo otros datos, por que normalmente las funciones de texto esperan un caracter nulo '\0' para terminar su funcion.

Luego de verlo estoy mas seguro de eso, Si tenes:

salida[30]
cliente [15]

Estos serian 45 caracteres sin contar el 0x00

GET /carpeta123/carpeta12.php?n=2&numero=000&

Hay que ver como se maneja el sprintf por dentro + como esta la RAM en ese momento para verificar el funcionamiento y ver por que se detiene ahi y no sigue "sobrescribiendo" mas datos
Título: Re:Funcion sprintf
Publicado por: Rseliman en 05 de Diciembre de 2015, 09:58:40
Ya lo solucione ...parti el String en dos ...


Muchas gracias !!!!!!!





Gracias KILLERJC

Me parece que no me da mas la RAM ....verifico  y comento ...no me habia dado cuenta

Mil Gracias



salida[30]

GET /carpeta123/carpeta12.php?n=2&numero=000&passw=ramiro2 HTTP/1.0

Conta cuantos caracteres tenes, tenes 30 en el "?" inclusive. Ese es un primer error. Acordate que son todos los char + un 0x00. Arregla eso a un buffer de mayor tamaño (68 el minimo para tu ejemplo) y luego se verifica si sigue el problema, para mi estas escribiendo otros datos, por que normalmente las funciones de texto esperan un caracter nulo '\0' para terminar su funcion.

Luego de verlo estoy mas seguro de eso, Si tenes:

salida[30]
cliente [15]

Estos serian 45 caracteres sin contar el 0x00

GET /carpeta123/carpeta12.php?n=2&numero=000&

Hay que ver como se maneja el sprintf por dentro + como esta la RAM en ese momento para verificar el funcionamiento y ver por que se detiene ahi y no sigue "sobrescribiendo" mas datos
Título: Re:Funcion sprintf
Publicado por: KILLERJC en 05 de Diciembre de 2015, 10:06:14
** Esto lo escribi y cuando fue a publicarlo, aparecio tu respuesta, asi que no lo modifique para nada **

No te da mas la RAM ?

- Envialo a la flash

const char text1[33]="GET /carpeta123/carpeta12.php?n=";  //Esto en flash
const char text2[12]=" HTTP/1.0\r\n"; // Esto en flash
char salida[30];


USARTWriteString(text1);
sprintf(salida,"%s&numero=%s&passw=%s",&cliente,&counter,&cpasword);
USARTWriteString(salida);
USARTWriteString(text2);

Esto obviamente si es posible leer de la flash, si hay lugar en la flash y tambien si no te importa la demora que ocasione leer de la Flash, aunque creo que nunca va a importar con esas funciones lo de la demora

- Otra es intentar "reutilizar" algun buffer que tengas y que no sea necesario

- Si vas a mantener numeros, para el counter por ejemplo o el cliente. mejor mantenelo en variables con numeros enteros,
y que luego el mismo sprintf los formatee. Ejemplo:

counter[15]

Eso ocupa 15 bytes, encima es complejo de realizar operaciones aritmeticas como suma por ejemplo(trata de sumarle 1 a ese contador). Tendrias 14 digitos decimales para ese valor.
99.999.999.999.999 , bastante grande para un contador creo

32 bits = Hasta 4.294.967.296 ( Solo 10 digitos y  no por completo para tenerlos todos en 9, pero... Creo que es suficiente para un contador)
Y ocupas solo 4 bytes. Contra esos 15.

Igual el cliente. Maximo 24 bits. No creo que manejes una base de datos de 16 millones de personas. parece un poco exagerado, o tal ves 16 bits es suficiente como para 65k de personas


EDIT, algo que me acabo de dar cuenta... un password por GET y sin encriptar ? :/
Título: Re:Funcion sprintf
Publicado por: Rseliman en 05 de Diciembre de 2015, 10:51:04
Muchas gracias Killerjc ...ok a todos los comentarios ...


tema passw por get ...si si es cierto muy desprotegido ...como lo harias ??







** Esto lo escribi y cuando fue a publicarlo, aparecio tu respuesta, asi que no lo modifique para nada **

No te da mas la RAM ?

- Envialo a la flash

const char text1[33]="GET /carpeta123/carpeta12.php?n=";  //Esto en flash
const char text2[12]=" HTTP/1.0\r\n"; // Esto en flash
char salida[30];


USARTWriteString(text1);
sprintf(salida,"%s&numero=%s&passw=%s",&cliente,&counter,&cpasword);
USARTWriteString(salida);
USARTWriteString(text2);

Esto obviamente si es posible leer de la flash, si hay lugar en la flash y tambien si no te importa la demora que ocasione leer de la Flash, aunque creo que nunca va a importar con esas funciones lo de la demora

- Otra es intentar "reutilizar" algun buffer que tengas y que no sea necesario

- Si vas a mantener numeros, para el counter por ejemplo o el cliente. mejor mantenelo en variables con numeros enteros,
y que luego el mismo sprintf los formatee. Ejemplo:

counter[15]

Eso ocupa 15 bytes, encima es complejo de realizar operaciones aritmeticas como suma por ejemplo(trata de sumarle 1 a ese contador). Tendrias 14 digitos decimales para ese valor.
99.999.999.999.999 , bastante grande para un contador creo

32 bits = Hasta 4.294.967.296 ( Solo 10 digitos y  no por completo para tenerlos todos en 9, pero... Creo que es suficiente para un contador)
Y ocupas solo 4 bytes. Contra esos 15.

Igual el cliente. Maximo 24 bits. No creo que manejes una base de datos de 16 millones de personas. parece un poco exagerado, o tal ves 16 bits es suficiente como para 65k de personas


EDIT, algo que me acabo de dar cuenta... un password por GET y sin encriptar ? :/
Título: Re:Funcion sprintf
Publicado por: KILLERJC en 05 de Diciembre de 2015, 12:13:06
Creo que lo minimo es POST, aunque si va el password asi limpio veo unas pocas ventajas nomas. Como que no quede en los logs de "accesos" a la paginas y que se pueda ver enteramente en la direccion que se accedio ( con nombre y pass ), aunque no evita un sniffing sobre el ethernet/wireless segun se use, o man-in-the-middle.
Dependiendo del tipo de informacion que poseas en tu DB y la importancia dependera de que tan complejo debe ser la seguridad, lo feo es que no es tan facil poner HTTPS en el PIC xD

Tambien seria necesario un ID de sesion, de parte del servidor al cliente y que vas a tener que manejar en tu PIC, tambien por otros problemas de seguridad.
Creo que problemas de seguridad son muchisimos :/, y realmente no estoy inmerso en el tema como para aconsejar que es lo correcto y que no.
Y todo va a depender de que lo poseas en la DB y la sensibilidad de la informacion.

Creo que hay otras personas mejores calificadas para hablar sobre el tema de seguridad y darte algunos tips para mejorar la seguridad o hacerlo totalmente seguro.
Título: Re:Funcion sprintf
Publicado por: Rseliman en 05 de Diciembre de 2015, 14:33:04
Muchisimas gracias !!!!

Abrazo


Creo que lo minimo es POST, aunque si va el password asi limpio veo unas pocas ventajas nomas. Como que no quede en los logs de "accesos" a la paginas y que se pueda ver enteramente en la direccion que se accedio ( con nombre y pass ), aunque no evita un sniffing
sobre el ethernet/wireless segun se use, o man-in-the-middle.
Dependiendo del tipo de informacion que poseas en tu DB y la importancia dependera de que tan complejo debe ser la seguridad, lo feo es




que no es tan facil poner HTTPS en el PIC xD

Tambien seria necesario un ID de sesion, de parte del servidor al cliente y que vas a tener que manejar en tu PIC, tambien por otros problemas de seguridad.
Creo que problemas de seguridad son muchisimos :/, y realmente no estoy inmerso en el tema como para aconsejar que es lo correcto y que no.
Y todo va a depender de que lo poseas en la DB y la sensibilidad de la informacion.

Creo que hay otras personas mejores calificadas para hablar sobre el tema de seguridad y darte algunos tips para mejorar la seguridad o hacerlo totalmente seguro.