Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-04-2011
Avatar de acertij022
acertij022 acertij022 is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina-Bs. As.
Posts: 233
Poder: 22
acertij022 Va por buen camino
Exclamation 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 )

Alguien se le ocurre alguna otra manera para lograr mi cometido.
Espero con muchas ansias sus comentarios.

Saludos a toda la comunidad
Responder Con Cita
  #2  
Antiguo 13-04-2011
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Pues la idea que cuentas me parece buena. Yo creo que se haría con algo así:
Código Delphi [-]
FUNCTION DeBase10aBase35 (Numero: INTEGER): STRING;
VAR
  Parte: INTEGER;
BEGIN
  DeBase10aBase35 := '';
  REPEAT
    Parte := Numero MOD 35;
    IF Parte < 9 THEN
      DeBase10aBase35 := Char (Ord ('0') + Parte) + DeBase10aBase35
    ELSE
      DeBase10aBase35 := Char (Ord ('A') + (Parte - 10) + DeBase10aBase35;
    Numero := Numero DIV 35;
  UNTIL Numero = 0;
END;
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...
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine

Última edición por Ñuño Martínez fecha: 13-04-2011 a las 11:05:25.
Responder Con Cita
  #3  
Antiguo 13-04-2011
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Hola,
No entiendo... ¿Desde cuando comprimir es cifrar (mal dicho encriptar)?

¿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,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #4  
Antiguo 14-04-2011
Avatar de acertij022
acertij022 acertij022 is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina-Bs. As.
Posts: 233
Poder: 22
acertij022 Va por buen camino
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 ) 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

Última edición por acertij022 fecha: 14-04-2011 a las 04:27:02.
Responder Con Cita
  #5  
Antiguo 14-04-2011
Avatar de acertij022
acertij022 acertij022 is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina-Bs. As.
Posts: 233
Poder: 22
acertij022 Va por buen camino
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?
Responder Con Cita
  #6  
Antiguo 14-04-2011
Avatar de acertij022
acertij022 acertij022 is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina-Bs. As.
Posts: 233
Poder: 22
acertij022 Va por buen camino
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?
Responder Con Cita
  #7  
Antiguo 14-04-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola acertijo022.

Número base 10 a base n:
Código Delphi [-]
function Base10ABaseN(Numero: Longint; const Base: Byte): string;
var
  i: Integer;
  NumAux: string;
  Modulo: Integer;
begin
  NumAux:='';
  repeat
    Modulo := Numero mod Base;
    Numero := Numero div Base;
    if Modulo > 9 then
      NumAux:= NumAux + chr(Modulo + 55)
    else
      NumAux:= NumAux + chr(Modulo + 48);
  until Numero <=0;
  for i := Length(NumAux) downto 1 do
    Result:= Result + NumAux[i];
end;

Número base N a base 10:
Código Delphi [-]
function BaseNABase10(Num : string; n : byte): Integer;
const
  Car = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; // límite: base 36
var
  i : Byte;
begin
  Result:=0;
  for i:= 1 to Length(Num) do
    Result:= Result * n + Pos(Upcase(Num[i]), Car) - 1;
end;

Llamadas de ejemplo usando el número 2314 con base 32 y 36:
Código Delphi [-]
  (* Numero en base 10 a base 32 *)
  ShowMessage(Base10ABaseN(2314, 32)); // 28A
  ShowMessage(Base10ABaseN(2314, 36)); // 1SA
  (* Numero en base 32 a base 10 *)
  ShowMessage(IntToStr(BaseNABase10('28A', 32)));// 2314
  ShowMessage(IntToStr(BaseNABase10('1SA', 36)));// 2314
  ...

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 14-04-2011 a las 18:00:28.
Responder Con Cita
  #8  
Antiguo 14-04-2011
Avatar de acertij022
acertij022 acertij022 is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina-Bs. As.
Posts: 233
Poder: 22
acertij022 Va por buen camino
Gracias ecfisa eso justamente lo que necesitaba.
Responder Con Cita
  #9  
Antiguo 14-04-2011
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #10  
Antiguo 14-04-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por roman Ver Mensaje
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
Ups, se me escapó ese 'detalle'...

Supongo que diciéndole al cliente que limite el número a 999999999999999999.

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 15-04-2011 a las 01:12:50.
Responder Con Cita
  #11  
Antiguo 14-04-2011
Avatar de acertij022
acertij022 acertij022 is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina-Bs. As.
Posts: 233
Poder: 22
acertij022 Va por buen camino
Es cierto me re entusiasme y me olvide que son 30 dígitos...
Responder Con Cita
  #12  
Antiguo 14-04-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por acertij022 Ver Mensaje
y me olvide que son 30 dígitos...
Te queda como consuelo que no fuiste el único

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 14-04-2011 a las 20:37:36.
Responder Con Cita
  #13  
Antiguo 14-04-2011
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Comprimir Roxy188 Varios 1 23-09-2008 23:52:18
comprimir AVI con la API zidfrid API de Windows 0 20-06-2007 22:40:28
comprimir AVI con la API. zidfrid C++ Builder 1 06-06-2007 22:18:11
Comprimir con UPX Mr.Vaka Varios 6 29-12-2005 14:00:50
comprimir un jpg User_baja1 Gráficos 1 08-07-2005 11:47:56


La franja horaria es GMT +2. Ahora son las 14:03:14.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi