TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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.
-
Hola,
necesito formatear de tal forma que los caracteres de la izquierda se rellenen con ceros, ejemplo: 000123.
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.
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
De mas esta decir que el tamaño del texto tiene que ser menor al largo de bcd - 1
Saludos !
-
RICHI777, era exactamente lo que necesitaba.
mil gracias
saludos
-
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!
-
Gracias Suky.
-
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!!
-
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
-
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!!
-
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");
-
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
-
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
-
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
-
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
-
** 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 ? :/
-
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 ? :/
-
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.
-
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.