Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Comprimir un numero (https://www.clubdelphi.com/foros/showthread.php?t=73291)

acertij022 13-04-2011 04:04:12

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

Ñuño Martínez 13-04-2011 10:45:57

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...

Delphius 13-04-2011 17:21:23

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,

acertij022 14-04-2011 04:03:12

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

acertij022 14-04-2011 06:08:39

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?

acertij022 14-04-2011 16:24:10

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?

ecfisa 14-04-2011 17:52:58

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.

acertij022 14-04-2011 18:08:47

Gracias ecfisa eso justamente lo que necesitaba.:D

roman 14-04-2011 18:44:10

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

ecfisa 14-04-2011 19:23:25

Cita:

Empezado por roman (Mensaje 397092)
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'... :o

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

Un saludo.

acertij022 14-04-2011 20:13:11

Es cierto me re entusiasme y me olvide que son 30 dígitos... :mad:

ecfisa 14-04-2011 20:32:44

Cita:

Empezado por acertij022 (Mensaje 397111)
y me olvide que son 30 dígitos... :mad:

Te queda como consuelo que no fuiste el único :D

Un saludo.

roman 14-04-2011 20:39:23

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 08:55:15.

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