FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour compresion de numeros
Posts: 401
Joined: Thu Oct 06, 2005 10:15 PM
compresion de numeros
Posted: Sat Nov 16, 2013 12:41 PM

Saludos amigos,

tengo la necesidad de tener un numero entero y comprimir este sin perdida.

Ejemplo:

el numero 8976452355661722
y obtener un numero mas pequeño como 123456

y volver a pasar 123456 a 8976452355661722

Saludos,



Pablo Alberto Vidal

/*

------------------------------------------------------

Harbour 3.2.0, Fivewin 17.02, BCC7

------------------------------------------------------

*/
Posts: 211
Joined: Wed Jul 16, 2008 12:59 PM
Re: compresion de numeros
Posted: Sun Nov 17, 2013 01:58 AM
Hola Pablo:

Yo tengo lo siguiente, talvez te sirva.

Code (fw): Select all Collapse
//----------------------------------------------------------------------------//
//BASE 62
//El algoritmo de Base 62, se trata sencillamente de pasar un número en base 10 a base 62, mantenimiento una relación de equivalencia
//entre número y carácter, por ejemplo A=10, B=11, ..z=61
//Base 62 equivale a hacer la conversión de número a palabras. Para lograrlo se basa en el método de divisiones sucesivas hasta llegar
//a un cociente 0, los restos en orden inverso, expresados como caracteres, nos dan la palabra resultante.
//----------------------------------------------------------------------------//

STATIC a62:= {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',;
          'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',;
          'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',;
          'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',;
          'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',;
          'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',;
          'y', 'z' }

//-------------------//
function Base10To62(nNumero, nLength, cFillChar)
Local nCociente := 1, nResto
Local cNumero := ""

Do While (nCociente >= 1)
   nCociente := nNumero / 62
   nResto := nNumero % 62
   cNumero := a62[nResto+1] + cNumero
   nNumero := nCociente
End Do

RETURN if(valtype(nLength)='N',PADL(cNumero,nLength,cFillChar),cNumero)

//-------------------//
function Base62To10(cNumero)
local i,nNumero:=0

cNumero := LTRIM(cNumero)
for i:=1 to len(cNumero)
   nNumero += (Ascan(a62,substr(cNumero,len(cNumero)+1-i,1))-1) * (62^(i-1))
next

RETURN nNumero



Un ejemplo de llamada:

Code (fw): Select all Collapse
Base10To62(8976452355661722) => 'f6xTbiL98'
Base62To10('f6xTbiL98') => 8976452355661722.00

Base10To62(9876543210987654321) => 'Blafhoas7qa'     de 19 digitos a 11
Base10To62(9999999999999999999) => 'Bui6Zolztll'       de 19 digitos a 11


Y asi lo uso:

Code (fw): Select all Collapse
//Retorna el numero de registro asignado a un comprobante
FUNCTION NRegistroB62()
   OrdSetFocus("NREGISTRO")
   DBGOBottom()
RETURN Base10To62(IF(EOF(), 1, Base62To10(FIELD->NREGISTRO)+1 ), FIELDLEN(FIELDPOS("NREGISTRO")),"0")


Atentamente

Rolando
Cochabamba, Bolivia

Continue the discussion