Member 12440766 Ответов: 2

Преобразование строки бит в строки char или наоборот, может в ASCII с#


привет,
Пожалуйста,не могли бы вы помочь мне с кодом на C# для преобразования строкового бита в строковый символ или наоборот, может быть, в ASCII
например:
bitstring ="001111111011010101001111110110111100111111110110110011111101101111"
resultstring ="?µ?o?Û?o"
и поменял ее местами...

Можете ли вы исправить мой код, если он самый лучший?

Что я уже пробовал:

кулак:
string result = "";
            while (value.Length > 0)
            {   var first8 = value.Substring(0, 8);
                value = value.Substring(8);
                var number = Convert.ToInt64(first8, 2);
                result += (char)number;



второй

string S = "";
            byte[] asciiBytes = Encoding.ASCII.GetBytes(value);
            for (int i = 0; i < asciiBytes.Length; i++)
                for (int j = 0; j < 8; j++)
                {
                    S += (asciiBytes[i] & 0x80) > 0 ? "1" : "0";
                    asciiBytes[i] <<= 1;
                }
            return S;

2 Ответов

Рейтинг:
1

OriginalGriff

Это будет зависеть от того, в каком формате "endian" находятся ваши данные: большой или маленький
Но вот два для преобразования из битов в символы:

private string CharStringFromBitStringLittleEndian(string s)
    {
    StringBuilder sb = new StringBuilder(s.Length / 8 + 1);
    byte temp = 0;
    byte bit = 1;
    foreach (char c in s)
        {
        if (c == '1') temp |= bit;
        bit <<= 1;
        if (bit == 0)
            {
            sb.Append((char)temp);
            bit = 1;
            temp = 0;
            }
        }
    if (bit != 1) sb.Append((char)temp);
    return sb.ToString();
    }
private string CharStringFromBitStringBigEndian(string s)
    {
    StringBuilder sb = new StringBuilder(s.Length / 8 + 1);
    byte temp = 0;
    byte bit = 128;
    foreach (char c in s)
        {
        if (c == '1') temp |= bit;
        bit >>= 1;
        if (bit == 0)
            {
            sb.Append((char)temp);
            bit = 128;
            temp = 0;
            }
        }
    if (bit != 1) sb.Append((char)temp);
    return sb.ToString();
    }


Рейтинг:
0

0x01AA

Решение 1 показывает, как преобразовать двоичный код в символьный.

Теперь преобразование символа в двоичное строковое представление можно выполнить например

1.) использование библиотеки .net

int value = 219;
string binary = Convert.ToString(value, 2).PadLeft(8, '0');

2.) самоделка
int value = 219;
StringBuilder sb = new StringBuilder(8);
while(value > 0)
{
	int mod= value % 2;
        if (mod == 0)
        {
        	sb.Insert(0, "0");
        }
	else
        {
        	sb.Insert(0, "1");
        }
        value /= 2;
}
string binary = sb.ToString().PadLeft(8, '0');


Примечание
Будьте осторожны, вы работаете с юникодом, для которого символ имеет 16 бит, в то время как ваш пример предполагает использование 8-битного символа.


0x01AA

Если вы хотите сделать его безопасным для Unicode, вам просто нужно использовать 16 бит вместо 8 бит.

[Редактировать]
Вы упомянули ASCII в этой теме. ASCII-это 7 бит. Подробнее об этом вы можете прочитать здесь: ASCII - Википедия[^]

.. и да, это не так просто, чтобы ознакомиться со всем этим ASCII/ansi/Unicode и т. д. ;)

Member 12440766

Большое вам спасибо, сэр .... Я извлек из этой информации большую пользу ... Спасибо Вам за то, что вы выбрали правильный путь для моего проекта

0x01AA

Добро пожаловать.