Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Problemas con comparacion de caracteres

Estas en el tema de Problemas con comparacion de caracteres en el foro de Visual Basic clásico en Foros del Web. Hola a todos: Tengo una funcion que compara caracteres en una cadena, pero extrañamente no siempre me compara bien. Ojala alguien me pueda ayudar, ya ...
  #1 (permalink)  
Antiguo 28/06/2010, 14:00
 
Fecha de Ingreso: agosto-2007
Mensajes: 268
Antigüedad: 16 años, 8 meses
Puntos: 2
Problemas con comparacion de caracteres

Hola a todos:

Tengo una funcion que compara caracteres en una cadena, pero extrañamente no siempre me compara bien. Ojala alguien me pueda ayudar, ya le he buscado...Este el codigo.

Function Simbolo() As String
Dim nCount As Integer
Dim strCadenaNueva As String, strCadena As String

strCadena = "hOLA.De esto es una prueba de comparacion"

strCadenaNueva = ""

For nCount = 1 To Len(strCadena)
If Mid(Ucase(strCadena), nCount, 1) = "D" Then
strCadenaNueva = strCadenaNueva & "="
Else
strCadenaNueva = strCadenaNueva & Mid(strCadena, nCount, 1)
End If
Next

Simbolo = strCadenaNueva
End Function

Lo más curioso es que en ocasiones si lo hace bien y en ocasiones no. Se supone me deberia regresar "hOLA.=e esto es una prueba =e comparacion"
Pero a veces me regresa la cadena bien y en ocasiones hace algo asi

"hOLA.De esto es una prueba =e comparacion"
"hOLA.De esto es una prueba de comparacion"
"hOLA.=e esto es una prueba de comparacion"

Uso visual basic 60

Saludos...
  #2 (permalink)  
Antiguo 28/06/2010, 14:14
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Problemas con comparacion de caracteres

Hola, acabo de crear un formulario le he añadido un command y he insertado tu código y este:

Private Sub Command1_Click()
Form1.Print Simbolo
End Sub

Por muchas veces que le de al boton, siempre me devuelve esto:

hOLA.=e esto es una prueba =e comparacion

¿ Algo en tu equipo no funciona ?

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #3 (permalink)  
Antiguo 28/06/2010, 14:34
 
Fecha de Ingreso: agosto-2007
Mensajes: 268
Antigüedad: 16 años, 8 meses
Puntos: 2
Respuesta: Problemas con comparacion de caracteres

Hola...gracias por responder:

No sé si influya en algo mi sistema Operativo es Windows 7, o si influya que la cadena de caracteres que mando es muy grande, en mi funcion puse solo el ejemplo

Saludos...
  #4 (permalink)  
Antiguo 28/06/2010, 15:00
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Problemas con comparacion de caracteres

Si le mandas una cadena grande, significa que no lo utilizas tal como está ¿ Porque no copias el código con el que llamas a la funcion para intentar detectar algo ?

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #5 (permalink)  
Antiguo 28/06/2010, 15:00
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 8 meses
Puntos: 29
Respuesta: Problemas con comparacion de caracteres

Entonces el fallo está en que la variable del nCount del For Next es un Integer, y las cadenas largas no las puede manipular. Usa un Long.
De todas formas para reemplazar en todo el texto puedes usar Replace, y lo haces todo en una sola línea.

Saludos
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!
  #6 (permalink)  
Antiguo 28/06/2010, 15:11
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Problemas con comparacion de caracteres

Hola pkj, quiero pensar que si fuese problema de Integer o Long, el proceso devolveria un error de Overflow al exceder el límite del Integer.

En cuanto al Replace, debería utilizar 2 líneas, una para suprimir mayúsculas y otra para minúsculas.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #7 (permalink)  
Antiguo 28/06/2010, 16:07
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Problemas con comparacion de caracteres

Hola yera2002 tal como te dice pkj y teniendo en cuenta el tema de la doble conversión por lo de mayúsculas y minúsculas, en el "banco de pruebas" esta funcion que aquí te dejo es 10 veces mas rápida que la que utilizas.


Function Simbolo(ByVal strCadena As String, strCaracter As String) As String
Simbolo = Replace(strCadena, UCase(strCaracter), "=")
Simbolo = Replace(Simbolo, LCase(strCaracter), "=")
End Function


Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #8 (permalink)  
Antiguo 28/06/2010, 16:51
 
Fecha de Ingreso: agosto-2007
Mensajes: 268
Antigüedad: 16 años, 8 meses
Puntos: 2
Respuesta: Problemas con comparacion de caracteres

Hola a todos gracias por contestar:
Bueno voy a exponer mi problema completo y quizá asi nos entendamos mejor.

Yo guardo informacion de tipo texto en una base de datos, esta informacion es muy grande y necesito encriptar la informacion. Primero intente via Base de datos (SQL Server) con informacion pequeña no tuve problema sin embargo con mucha informacion tuve problema de datos truncados. Por lo que pensé en generar un algoritmo de encriptacion y buscando en Internet encontre un OCX llamado CAPICOM distribuido por microsoft el cual hace esta funcion. Ahora bien, yo requiero dejar esa informacion en un campo de la base de datos, pero cuando guardo el registro me dice que necesito especificar los valores de algunos campos. Verifique la informacion y encontre que al momento de encriptar la informacion algunos caracteres vienen con ' (comilla simple) por lo que el manejador de base de datos lo toma como un separador de columnas.

Ahora bien, intenté crear esta funcion para sustituir esta comilla simple por un conjunto de caracteres, sin embargo si la cadena que me regresa la propiedad CONTENT del objeto CAPICOM viene con varias comillas simples, solo me reemplaza 1. Lo que hice fue debbugear el proyecto y obtener el valor de la propiedad CONTENT de CAPICOM e ir caracter por caracter revisando. La cadena que estoy probando tiene una longitud de 18000 caracteres mas o menos y solo revise unos 20, la parte que revise venia asi:

????????????????CA??????????????????

Entonces al hacer el debbug puse un msgbox si la letra detectada era una "C", pero nunca me lo mostro. Aun cuando yo verifique el valor en la funcion MID()
Ahora bien, ya analizando el codigo me di cuenta que estoy regresando un valor binario. ¿Alguien me puede decir como lo puedo resolver?

Codigo:

Sub cmdEncripta()
strCodigoEncripta = Trim(rstFormato("codigo"))
objCapicom.Content = strCodigoEncripta
objCapicom.SetSecret "mipass", CAPICOM_SECRET_PASSWORD
objCapicom.Algorithm = CAPICOM_ENCRYPTION_ALGORITHM_3DES
strResultado = objCapicom.Encrypt(CAPICOM_ENCODE_BINARY)
If Len(strResultado) = 0 Then
MsgBox "Fallo al encriptar informacion.", vbCritical + vbOKOnly, "EncryptaBD"
Else
strResultado = Replace(strResultado, "'", "CHD+*=")
End If
end Sub
  #9 (permalink)  
Antiguo 28/06/2010, 17:55
 
Fecha de Ingreso: agosto-2007
Mensajes: 268
Antigüedad: 16 años, 8 meses
Puntos: 2
Respuesta: Problemas con comparacion de caracteres

Hola a todos:

Ya encontre la solucion, el problema estaba en que estaba comparando Binarios contra texto, esto por que en la funcion de encriptacion de CAPICOM esta codificando en binario, por lo que la cambie a Base64 de tal modo que mi codigo quedo asi:

Sub cmdEncripta()
strCodigoEncripta = Trim(rstFormato("codigo"))
objCapicom.Content = strCodigoEncripta
objCapicom.SetSecret "mipass", CAPICOM_SECRET_PASSWORD
objCapicom.Algorithm = CAPICOM_ENCRYPTION_ALGORITHM_3DES
strResultado = objCapicom.Encrypt(CAPICOM_ENCODE_BASE64)
If Len(strResultado) = 0 Then
MsgBox "Fallo al encriptar informacion.", vbCritical + vbOKOnly, "EncryptaBD"
Else
strResultado = Replace(strResultado, "'", "CHD+*=")
End If
end Sub

Etiquetas: caracteres, comparacion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:59.