Avatar billede davidfossil Nybegynder
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-99b0449aa8af

Kan det overhovedet lade sig gøre? Hvis ja: Hvordan?

På forhånd tak for hjælpen :)
Avatar billede arne_v Ekspert
27. maj 2005 - 12:52 #1
det vil være meget besværligt

256 mulige tegn (8 bit) -> 64 mulige tegn (6 bit) er nemt

256 mulige tegn (8 bit) -> 32 mulige tegn (5 bit) er nemt

men for 60 tegn ca. 7.5 bit skal du lige finde ud af hvad du præcist vil
Avatar billede davidfossil Nybegynder
27. maj 2005 - 12:53 #2
Forestillede mig at der var en sådan "matematisk" forhindring...

Hvad med 7 bit, giver det 56 tegn eller noget i den stil?
Og er det nogenlunde til at gå til?
Avatar billede davidfossil Nybegynder
27. maj 2005 - 13:18 #3
hov, der kludere jeg vist lidt i den....
Avatar billede arne_v Ekspert
27. maj 2005 - 13:30 #4
5 => 32
6 => 64
7 => 128
Avatar billede davidfossil Nybegynder
27. maj 2005 - 13:58 #5
Så svaret er at det slet ikke lader sig gøre?
Avatar billede arne_v Ekspert
27. maj 2005 - 14:38 #6
ikke umiddelbart men hvis man f.eks. definerer base 64 som 3 byte -> 4 byte
via % 64 så kan man godt lave noget % 60, men det vil bliver noge rigtigt
hjemme bryg
Avatar billede arne_v Ekspert
27. maj 2005 - 23:29 #7
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();
        }
    }
}
Avatar billede arne_v Ekspert
27. maj 2005 - 23:30 #8
jeg valgte at konvertere 5 byte -> 7 byte via base60
Avatar billede davidfossil Nybegynder
29. maj 2005 - 17:42 #9
Well, jeg vil se hvad jeg får ud af det - smid et svar :)
Avatar billede arne_v Ekspert
29. maj 2005 - 18:18 #10
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester