27. maj 2005 - 12:48
Der er
9 kommentarer og
1 løsning
Base60 i C#
.NET frameworket understøtter konvertering af binær data, til base64 text. Som bekendt indeholder base 64 samtlige tal (0-9), alle bogstaver i det amerikanske alfabet (a-z og A-Z) plus et par tegn (+ = _ ?) - er ikke helt sikker på om det var de rigtige tegn...
Anyway, jeg søger en klasse der kan konvertere binær data til "base60", altså udelukkende alfanumeriske tegn. På følgende link findes et eksempel på hvordan man i C# kan implementere en base32 converter, men jeg kan ikke selv lure hvordan dette kan omskrives så det tager base60 i stedet.
http://www.atrevido.net/blog/PermaLink.aspx?guid=debdd47c-9d15-4a2f-a796-99b0449aa8afKan det overhovedet lade sig gøre? Hvis ja: Hvordan?
På forhånd tak for hjælpen :)
her er et eksempel til at sætte dig igang:
using System;
using System.Text;
namespace E
{
public class Base60
{
private const string ENC = "ABCDEFGHIJKLMNOPQRSTUWVXYZabcdefghijklmnopqrstuwvxyz01234567";
private static int[] SKIP57 = { 0, 1, 2, 4, 5 };
private static int[] SKIP75 = { 0, 1, 2, 3, 3, 4, 5 };
public static string ToBase60(byte[] b)
{
int n = (b.Length - 1) / 5 + 1;
int n2 = 7 * n - SKIP57[5 * n - b.Length];
StringBuilder sb = new StringBuilder("");
for(int i = 0; i < n; i++)
{
long tmp = 0;
for(int j = 4; j >= 0; j--)
{
if((5 * i + j) < b.Length)
{
tmp = 256 * tmp + b[5 * i + j];
}
}
for(int k = 0; k < 7; k++)
{
if((7 * i + k) < n2)
{
sb.Append(ENC[(int)(tmp % 60)]);
tmp = tmp / 60;
}
}
}
return sb.ToString();
}
public static byte[] FromBase60(string s)
{
int n = (s.Length - 1) / 7 + 1;
int n2 = 5 * n - SKIP75[7 * n - s.Length];
byte[] b = new byte[n2];
for(int i = 0; i < n; i++)
{
long tmp = 0;
for(int j = 6; j >= 0; j--)
{
if(7 * i + j < s.Length)
{
tmp = 60 * tmp + ENC.IndexOf(s[7 * i + j]);
}
}
for(int k = 0; k < 5; k++)
{
if(5 * i + k < n2)
{
b[5 * i + k] = (byte)(tmp % 256);
tmp = tmp / 256;
}
}
}
return b;
}
}
class TestClass
{
public static void Main(string[] args)
{
byte[] b1 = { 1, 2, 3, 4, 5, 6, 7, 8 };
string s1 = Base60.ToBase60(b1);
Console.WriteLine(s1);
byte[] b2 = Base60.FromBase60(s1);
for(int i = 0; i < b2.Length; i++) Console.Write(" " + b2[i]);
Console.WriteLine();
byte[] b3 = { 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 255 };
string s2 = Base60.ToBase60(b3);
Console.WriteLine(s2);
byte[] b4 = Base60.FromBase60(s2);
for(int i = 0; i < b4.Length; i++) Console.Write(" " + b4[i]);
Console.WriteLine();
}
}
}