Laden...

BitStringConverter

Erstellt von gelöschtem Konto vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.926 Views
Gelöschter Account
vor 14 Jahren
BitStringConverter

die folgende klasse macht aus einem beliebigen string eine bit-repräsentation als string.
z.b. wird aus dem buchstaben "A" ein "01000001" als stringtyp.

das kann man auch mit ganzen sätzen machen:
"Fischers Fritz frisst frischen Fisch" -> "010001100110100101110011011000110110100001100101011100100111001100100000010001100111001001101001011101000111101000100000011001100111001001101001011100110111001101110100001000000110011001110010011010010111001101100011011010000110010101101110001000000100011001101001011100110110001101101000" -> "Fischers Fritz frisst frischen Fisch"

und umgekehrt.

    class BitStringConverter
    {
        public static string StringToBitString(string input)
        {
            return StringToBitString(input, Encoding.Default);
        }

        public static string StringToBitString(string input, Encoding encoding)
        {
            byte[] stringBytes = encoding.GetBytes(input);
            StringBuilder result = new StringBuilder(stringBytes.Length * 8);

            foreach (byte b in stringBytes)
            {
                for(int i = 128; i > 0; i /= 2)
                {
                    result.Append(((b & i) == 0) ? 0 : 1);
                }
            }
            return result.ToString();
        }

        public static string BitStringToString(string input)
        {
            return BitStringToString(input, Encoding.Default);
        }

        public static string BitStringToString(string input, Encoding encoding)
        {
            List<byte> byteArray = new List<byte>();
            
            byte temp = 0;
            for (int i = 0, j = 0; i < input.Length; i++ )
            {
                if (input[i] == '1') temp |= (byte)(1 << (8 - i % 8 - 1));

                if (++j == 8)
                {
                    byteArray.Add(temp);
                    temp = 0;
                    j = 0;
                }
            }

            string result = new string(encoding.GetChars(byteArray.ToArray()));

            return result;
        }
    }
49.485 Beiträge seit 2005
vor 14 Jahren

Hallo JAck30lena,

es wäre praktisch, wenn es jeweils noch eine Überladung geben würde, bei der man das Encoding per Parameter übergeben könnte. Und noch jeweils noch eine, bei der man direkt das byte-Array angeben bzw. direkt als Rückgabewert bekommt kann.

Wobei mir die Asymmetrie der Methoden aufgefallen ist: Hin: ASCII, zurück Unicode (durch den char-Cast). Ok, da bei der "Hinrichtung" alles über 7 bit abgeschnitten wird und die 7-bit-Werde von ASCII und Unicode übereinstimmen, gibt es kein Problem, solange der an BitStringToString übergebene String von StringToBitString erzeugt wurde. Aber das muss ja nicht so sein und deshalb wäre es schon schöner, wenn für beide Richtungen explizit ein Encoding verwendet würde.

herbivore

Gelöschter Account
vor 14 Jahren

ich hab die sache mt den encodings eingepflegt 😃

das mit dem bytearray habe ich nicht übernommen, da das eigendlich eine klasse für ein irc client ist, wo man soche "mutatoren" hinzuschalten kann 😃