![]() |
Comprimir un numero
Buenas Delphiano, necesito su ayuda ya que debo realizar una encriptacion de un numero de unos 30 dígitos en una frase alfanumérica lo mas corta posible para transmitirla verbalmente.
Hasta ahora lo único que se me ocurrió es pasar de la base numérico 10 a base numérico 35 ( A-Z 0-9). aunque todabia estoy analizando como hacer el codigo ( estoy un poco oxidado :o ) Alguien se le ocurre alguna otra manera para lograr mi cometido. Espero con muchas ansias sus comentarios. Saludos a toda la comunidad :D |
Pues la idea que cuentas me parece buena. Yo creo que se haría con algo así:
Que conste que lo he hecho de memoria, sin comprobar si funciona o no, pero creo que se pilla la idea, ¿no? Eso sí, ojo con la W... |
Hola,
No entiendo... ¿Desde cuando comprimir es cifrar (mal dicho encriptar)? :rolleyes: ¿Al final, que necesitas hacer? ¿Comprimir o cifrar? Lo más parecido a una "comprensión" y a un cifrado, que yo conozca, son los algoritmos de reducción como MD5. Saludos, |
Gracias a ambos por responder.
le detallo mejor el problema: Mi cliente me debe pasar un numero de 30 dígitos por telefono (no tengo otro medio :confused: ) y esto me acarrea 2 inconvenientes. 1- el cliente no debe percatarse del dato que me esta pasando (por eso la encriptación). 2-Debo reducir los mas posible este dato para evitar algún error al dictarme el numero. Por eso lo 1° que se me vino a la mente es en ves de pasar a base 16 (hexadecimal) pasarlo a base 35 y asi utilizar los caracteres del abecedario(reduciendo los caracteres que me dicta y a la ves no se percatara del dato que me esta pasando). pero no me es sencillo ya que para pasar entre base en algún momento tendré que dividir y el numero de 30 dígito es muy largo incluso para ponerlo en una variable Int64 Por eso necesito de su ayuda para ver si me ayudan a pasar un numero de 30 dígitos de base 10 (guardado en un string)a base 35 y la operación inversa. O si se le ocurre alguna otra manera para solucionar el inconveniente. siguiendo la lógica que indico ñuño no me pasa correctamente al intentar de pasar el numero 36 a base 35 me debería dar Z0 |
Analizando un poco la base debería ser 32 ya que el 32 equivale en binario al número 11111 con lo cual el pasaje seria pasar el string que contiene el numero en base 10 a binario y separar el resultado en grupos de de 5 y colocar su equivalente en base 32 y multiplicando el numero según la posición. es decir
34 en base 10 100010 en base 2 1 00010 lo separo en grupo de 5 1 2 lo paso cada grupo a su equivalente en base 32 y por ultimo multiplico según la posición 1 x 32 + 2 = V2 entonces 34 en base 10 es igual a V2 en base 32 ¿Es correcta mi deducción? |
Otra manera mas sencilla que encontre.
suponiendo que tenemos el numero 2314 en base 10 2334/32 = 72 resto = 10 72/32 = 2 resto 8 con lo cual nos queda 28A y el proceso inverso: A *1 + 8* 32 + 2 *32 * 32 = 2314 El inconveniente ahora que tengo es: ¿en que tipo de variable lo puedo poner para luego realizar la división ya que los 30 dígitos no entra en un Int64? |
Hola acertijo022.
Número base 10 a base n:
Número base N a base 10:
Llamadas de ejemplo usando el número 2314 con base 32 y 36:
Un saludo. |
Gracias ecfisa eso justamente lo que necesitaba.:D
|
Y, ¿cómo se resuelve lo de que el número de 30 dígitos no cabe en un Int64 (menos en un longint)?
// Saludos |
Cita:
Supongo que diciéndole al cliente que limite el número a 999999999999999999. :) Un saludo. |
Es cierto me re entusiasme y me olvide que son 30 dígitos... :mad:
|
Cita:
Un saludo. |
Creo que se pueden usar los BCD para números muy, muy grandes, aunque la aritmética con ellos se hace más lenta, pero para un número no debe ser de consideración.
// Saludos |
La franja horaria es GMT +2. Ahora son las 04:49:49. |
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