Jag har letat efter en funktion som hjälper mig att korta ner långa tal till en siffer / bokstavskombination. ex skulle talet 4820002993884772 istället bli AF235Z4. Jag kan endast använda tecken från 32:a basen + lite till: 0-9, A-Z. Jag tror att den här koden är vad du söker. Tänk på att den är gjord för ASP (VBScript) så den bör fungera rakt av men samtidigt så borde du deklarera alla variabler rätt osv. För den ursprungliga funktionen:Gamla VB6 entusiaster, bit i denna...
Jag hittade nedan funktion på nätet (riktigt bra för mitt ändamål) som tom tar hänsyn till tecken som I och O som lätt förväxlas med 1 och 0. Men mitt problem är att jag klarar inte göra en Decode funktion, har gett upp men skulle verkligen behöva den.
Finns det någon som känner för att bita i den?
Convert Long Integer to an equivalent Base32 String
' Purpose: Converts an Integer to a Base32 representation
' Inputs: lngInp = Integer to be converted
' blnInp = Optional Boolean to indicate whether leading
' zeros are included in the result. Default is
' to omit the leading zeros.
' Returns: A string representation of the Base32 equivalent
' Comments:
' In order to avoid confusion with the numbers 1 and 0, the
' letters I and O are skipped. I also seem to recall that the
' letter Q and J should be similarly skipped. To do this, you
' must change the Select Case statement accordingly.
Public Function ConvertToBase32( _
ByVal lngInp As Long, _
Optional ByVal blnInp As Boolean) As String
Dim intCnt As Integer 'Integer counter for loop
Dim strOut As String 'temp String holds result
Dim intOut As Integer 'holds Integer part of formula
strOut = "" 'initialize variable
If IsMissing(blnInp) Then blnInp = False
For intCnt = 6 To 0 Step -1
intOut = Int(lngInp / (32 ^ intCnt))
Select Case intOut
Case Is = 0
If blnInp Then strOut = strOut & "0"
Case Is < 10 'numbers between 0 and 9
strOut = strOut & Format(intOut, "0")
Case Is < 18 'letters between A and H (skip I)
strOut = strOut & Chr(intOut + 55)
Case Is < 23 'letters between J and N (skip O)
strOut = strOut & Chr(intOut + 56)
Case Else 'letters between P and X
strOut = strOut & Chr(intOut + 57)
End Select
lngInp = lngInp - intOut * (32 ^ intCnt)
Next intCnt
ConvertToBase32 = strOut
End Function
Sv: Gamla VB6 entusiaster, bit i denna...
<code>
Function ValToText(ByVal Nr)
AllowedChars = "0123456789abcdef"
Text = ""
Rest = Nr
Do While Rest > 0
Index = (Rest Mod (Len(AllowedChars) ^ (Len(Text) + 1))) / (Len(AllowedChars) ^ Len(Text))
Text = Mid(AllowedChars, Index +1, 1) & Text
Rest = Rest - (Index * (Len(AllowedChars) ^ (Len(Text) -1)))
Loop
ValToText = Text
End Function
Function TextToVal(ByVal Text)
AllowedChars = "0123456789abcdef"
Nr = 0
X = 0
Do While X < Len(Text)
Nr = Nr + (InStr(AllowedChars, Mid(Text, Len(Text) - X, 1)) - 1) * (Len(AllowedChars) ^ X)
X = X + 1
Loop
TextToVal = Nr
End Function
</code>
Edit: Ändra bara AllowedChars till vilka tecken du vill använda (med eller utan i och o)
ThomasSv: Gamla VB6 entusiaster, bit i denna...
Public Function ConvertFromBase32(strInp As String) As Long
Dim i As Integer
Dim result As Long
result = 0
For i = Len(strInp) - 1 To 0 Step -1
result = result + DecodeChar(Mid(strInp, i + 1, 1)) * 32 ^ (Len(strInp) - 1 - i)
Next i
ConvertFromBase32 = result
End Function
Public Function DecodeChar(chrInp As String) As Integer
Select Case Asc(chrInp)
Case Is <= 57 ' 0-9
DecodeChar = CInt(chrInp)
Case Is <= 72 ' A-H
DecodeChar = Asc(chrInp) - 55
Case Is <= 79 ' J-N
DecodeChar = Asc(chrInp) - 56
Case Else
DecodeChar = Asc(chrInp) - 57
End Select
End Function