Convert QUAD to BASEn and v.v.

Just starting out? Need help? Post your questions and find answers here.
roleg
User
User
Posts: 51
Joined: Wed Feb 24, 2010 2:07 pm

Convert QUAD to BASEn and v.v.

Post by roleg »

Code: Select all

#alphanum$="0123456789abcdefghijklmnoprstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZабвгдежзийклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ!@#$%^&*()_+-=[]{}\|:;'"+Chr(34)+",.<>/?`~ "
Global lenc.q=Len(#alphanum$)

Procedure.s NumToBase(x.q)
  ; Convert number to base string.
  Protected.s r$
  If x > 0
    While x <> 0
      r$ = Mid(#alphanum$, (x % lenc) + 1, 1) + r$
      x / lenc
    Wend
  Else
    r$ = "0"
  EndIf
  ProcedureReturn r$
EndProcedure

Procedure.q BaseToNum(base$)
  ; Convert base string to number.
  Protected i.i, x.q, blen.q
  x = FindString(#alphanum$, Right(base$, 1)) - 1  ; get last character
  blen = Len(base$)
  For i = blen - 1 To 1 Step -1
    x = x + Pow(lenc, (blen - i)) * (FindString(#alphanum$, Mid(base$, i, 1)) - 1)
  Next i
  ProcedureReturn x
EndProcedure

Debug NumToBase(9223372036854775807)  ; nЩCEхСmZ\
Debug BaseToNum("nЩCEхСmZ\") ; 9223371659080778752
I try to use Quad number to convert extra big number to alphanumeric string.

9223372036854775807 --> nЩCEхСmZ\

but vice versa, I can not

nЩCEхСmZ\ --> 9223371659080778752

9223372036854775807 != 9223371659080778752

why is this happening?
Little John
Addict
Addict
Posts: 4777
Joined: Thu Jun 07, 2007 3:25 pm
Location: Berlin, Germany

Re: Convert QUAD to BASEn and v.v.

Post by Little John »

Hi,

this code works as expected.

Please compare yourself where the crucial differences to your code are. :-)
roleg
User
User
Posts: 51
Joined: Wed Feb 24, 2010 2:07 pm

Re: Convert QUAD to BASEn and v.v.

Post by roleg »

Thanks, Little John

Code: Select all

#alphanum$="0123456789abcdefghijklmnoprstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZабвгдежзийклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ!@#$%^&*()_+-=[]{}\|:;'"+Chr(34)+",.<>/?`~ "
Global lenc.i=Len(#alphanum$)

Procedure.s StrX (number.q)
   Protected digit.i, ret$=""
   
   Repeat
      digit = number % lenc
      ret$ = Mid(#alphanum$, digit+1, 1) + ret$
      number / lenc
   Until number = 0
   
   ProcedureReturn sign$ + ret$
EndProcedure

Procedure.q ValX (number$)
   Protected i.i, digit.i, ret.q=0
   
   For i = 1 To Len(number$)
      digit = FindString(#alphanum$, Mid(number$,i,1)) - 1
      ret = ret*lenc + digit
   Next
   
   ProcedureReturn ret
EndProcedure

Debug 9223372036854775807
s$ = StrX(9223372036854775807)
Debug s$
Debug ValX(s$)
9223372036854775807
nЩCEхСmZ\
9223372036854775807


Now it's working :D
Post Reply