Преобразовать список <boolean>в строку - PullRequest
6 голосов
/ 10 февраля 2012

Я получил логический список с 92 логическими значениями, я хочу, чтобы список был преобразован в строку, я подумал, что возьму 8 логических значений (битов) и поместу их в байт (8 битов), а затем использую ASCII для преобразования это значение байта для символа, затем добавьте символы в строку. Однако после того, как гуглил более 2 часов, не повезло. Я попытался преобразовать список в список байтов, но он тоже не работал ^^.

String strbyte = null;
for (int x = 0; x != tmpboolist.Count; x++) //tmpboolist is the 90+- boolean list
{
   //this loop checks for true then puts a 1 or a 0 in the string(strbyte)
   if (tmpboolist[x])
   {
      strbyte = strbyte + '1'; 
   }
   else
   {
      strbyte = strbyte + '0';
   }
}

//here I try to convert the string to a byte list but no success
//no success because the testbytearray has the SAME size as the 
//tmpboolist(but it should have less since 8 booleans should be 1 Byte)
//however all the 'Bytes' are 48 & 49 (which is 1 and 0 according to
//http://www.asciitable.com/)
Byte[] testbytearray = Encoding.Default.GetBytes(strbyte); 

PS Если у кого-нибудь есть лучшее предложение о том, как кодировать и декодировать логический список в строку? (Потому что я хочу, чтобы люди делились своим логическим списком со строкой, а не со списком 90 1 и 0.)

РЕДАКТИРОВАТЬ: теперь все работает! Ты все за помощь

string text = new string(tmpboolist.Select(x => x ? '1' : '0').ToArray());
byte[] bytes = getBitwiseByteArray(text); //http://stackoverflow.com/a/6756231/1184013
String Arraycode = Convert.ToBase64String(bytes);
System.Windows.MessageBox.Show(Arraycode);
//first it makes a string out of the boolean list then it uses the converter to make it an Byte[](array), then we use the base64 encoding to make the byte[] a String.(that can be decoded later)

Я посмотрю кодировку 32 позже, чтобы снова помочь: :)

Ответы [ 4 ]

14 голосов
/ 10 февраля 2012

Вы должны хранить ваши логические значения в BitArray .

var values = new BitArray(92);
values[0] = false;
values[1] = true;
values[2] = true;
...

Затем вы можете преобразовать BitArray в байтовый массив

var bytes = new byte[(values.Length + 7) / 8];
values.CopyTo(bytes);

и байтовый массив в строку Base64

var result = Convert.ToBase64String(bytes);

И наоборот, вы можете преобразовать строку Base64 в байтовый массив

var bytes2 = Convert.FromBase64String(result);

и байтовый массив для BitArray

var values2 = new BitArray(bytes2);

Строка Base64 выглядит следующим образом: "Liwd7bRv6TMY2cNE". Это, вероятно, немного неудобно для обмена между людьми; взгляните на ориентированную на человека кодировку base-32 :

Предполагаемое использование этих [строк 32-й базы] включает and-paste, редактирование текста (например, в файлах HTML), ручная транскрипция через клавиатура, ручная транскрипция пером и бумагой, голосовая транскрипция телефон или радио и т. д.

Desiderata для такой кодировки:

  • минимизация ошибок транскрипции - например, общеизвестная проблема путаницы '0' с 'O'
  • встраивание в другие структуры - например, поисковые системы, структурированные или размеченный текст, файловые системы, командные оболочки
  • краткость - короткие [строки] лучше, чем длинные.
  • эргономика - пользователи-люди (особенно нетехнические) должны найти [strings] как можно проще и приятнее. Чем страшнее выглядит [струны], тем хуже.
2 голосов
/ 10 февраля 2012

Для начала, плохая идея объединять строки в такой цикл - по крайней мере, используйте StringBuilder или используйте что-то подобное с LINQ:

string text = new string(tmpboolist.Select(x => x ? '1' : '0').ToArray());

Но преобразование вашей строки в List<bool> легко с LINQ, используя тот факт, что string реализует IEnumerable<char>:

List<bool> values = text.Select(c => c == '1').ToList();

Непонятно, куда входит байтовый массив ... но вы должны не пытаться представить произвольные двоичные данные в строке, просто используя Encoding.GetString. Это не то, для чего это.

Если вам все равно, какой формат использует ваша строка, тогда использование Base64 будет работать хорошо, но имейте в виду, что если вы группируете свои логические значения в байты, вам понадобится дополнительная информация, если вы хотите различать " Например, «7 значений» и «8 значений, первое из которых является ложным».

1 голос
/ 10 февраля 2012

Поскольку из вашего кода я делаю вывод, что вам нужна строка с n цифрами, равными 1 или 0, в зависимости от значения bool внутренних списков, тогда как насчет ...

public override string ToString()
{
    StringBuilder output = new StringBuilder(91);
    foreach(bool item in this.tempboolist)
    {
        output.Append(item ? "1" : "0");
    }
    return output.ToString();
}

Предупреждение, что это было не так:, Я еще не проверял это с помощью компилятора!

0 голосов
/ 10 февраля 2012

Эта функция делает то, что вы хотите:

    public String convertBArrayToStr(bool[] input)
    {
        if (input == null)
            return "";
        int length = input.Count();
        int byteArrayCount = (input.Count() - 1) / 8 + 1;
        var bytes = new char[byteArrayCount];

        for (int i = 0; i < length; i++ )
        {
            var mappedIndex = (i - 1) / 8;
            bytes[mappedIndex] = (char)(2 * bytes[mappedIndex] +(input[i] == true ? 1 : 0));
        }
        return new string(bytes);
    }
...