2012-02-10 2 views
6

Я получил логический список из 92 булевых элементов, я хочу, чтобы список был преобразован в строку, я думал, что я возьму 8 булевых (битов) и поместил их в байт (8 бит), а затем используйте ASCII, чтобы преобразовать значение байта в символ, затем добавьте символы в строку. Однако после googeling в течение более 2 часов, не повезло. Я попытался преобразовать список в список байтов, но он не работал ни с^^.Convert List <boolean> to String

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.)

EDIT: теперь он работает! ти все за помощь

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) 

Я буду смотреть в encoding32 позже, ти за помощь еще раз :)

+0

вы должны быть более конкретным, что вы хотите, чтобы ваша строка выглядеть –

+0

Это не ясно, что вы хотите, чтобы в конечном итоге с. Строка, которая является кодировкой ascii битов, которая затем может быть возвращена в логическое значение? – jlew

+1

'Encoding.Default.GetBytes' не делает то, что вы думаете. См. Этот вопрос: http://stackoverflow.com/questions/2989695/how-to-convert-a-string-of-bits-to-byte-array –

ответ

13

Вы должны хранить свои логические значения в 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". Это, вероятно, немного неудобно для обмена людьми; взглянуть на human-oriented base-32 encoding:

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

желаемые результатов для такого кодирования являются:

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

Привет, я не возражаю, это база 64 Я думаю, что это код, который может использовать ppl (99% будет копировать и вставлять), а затем импортировать в приложение, и они смогут увидеть, какие предметы у них есть (true) или не имеют (false). Редактировать: я не хочу хранить его в BitArray, так как он может расти (список), поэтому размер может увеличиться, поэтому проще использовать Список . Справа: p? – Maximc

+0

На всякий случай: [Реализация Base32Encoding для .NET] (http://hemant-jangid.blogspot.com/2009/06/base32encoding-implementation-for-net.html) – dtb

+0

Я использую логический список, поэтому первая часть doesn t, но все остальное делает, но мне все еще нужно найти способ получить мой tmpboollist в Byte []. – Maximc

1

Начнем с того, что это плохая идея для конкатенации строк в цикле, как, что - по крайней мере, использовать 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(); 

Непонятно, где находится массив байтов ... но вы should not try to represent arbitrary binary data in a string just using Encoding.GetString. Это не то, для чего.

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

+0

Благодарим вас за приятную помощь. Теперь мне больше не нужна петля! :) – Maximc

1

Поскольку я infering из вашего кода вы хотите строку с п цифрами 1 или 0 в зависимости Weather.co.ua исполнился внутренними списками логического значения, то как насчет ...

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

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

0

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

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); 
    }