2012-02-10 21 views
6

Ho ottenuto una lista booleana con 92 booleani, voglio che la lista sia convertita in una stringa, ho pensato di prendere 8 booleani (bit) e metterli in un byte (8 bit) e poi usa ASCII per convertirlo in un char valore in byte e poi aggiungi i char in una stringa. Tuttavia dopo aver fatto googeling per più di 2 ore, nessuna fortuna. Ho provato a convertire la lista in una lista Byte ma non funzionava neanche ^^.Converti lista <boolean> in stringa

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 Se qualcuno ha una migliore suggerimento su come codificare & decodificare un elenco booleana ad una stringa? (Perché voglio che le persone condividano la loro lista booleana con una stringa piuttosto che una lista di 90 1 e 0).

EDIT: funziona ora! ty tutto per aiutare

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) 

I ll guardo nella encoding32 tardi, ty per tutto l'aiuto ancora una volta :)

+0

è necessario essere più specifico su ciò che si desidera che la stringa a guardare come –

+0

Non è chiaro che cosa si vuole finire con. Una stringa che è una codifica ascii di bit, che può quindi essere trasformata in booleani? – jlew

+1

'Encoding.Default.GetBytes' non fa quello che pensi che faccia. Vedi questa domanda: http://stackoverflow.com/questions/2989695/how-to-convert-a-string-of-bits-to-byte-array –

risposta

13

È necessario memorizzare i valori booleani in un BitArray.

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

Quindi è possibile convertire il BitArray ad un array di byte

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

e l'array di byte in una stringa Base64

var result = Convert.ToBase64String(bytes); 

D'inversione, è possibile convertire una stringa Base64 a un array di byte

var bytes2 = Convert.FromBase64String(result); 

e l'array di byte a un BitArray

var values2 = new BitArray(bytes2); 

La stringa Base64 assomiglia a questo: "Liwd7bRv6TMY2cNE". Questo è probabilmente un po 'non comune per la condivisione tra le persone; dare un'occhiata a human-oriented base-32 encoding:

usi attesi di questi [base-32 stringhe] includono cut e incolla, modifica del testo (per esempioin file HTML), trascrizione manuale tramite un tastiera, trascrizione manuale tramite penna e carta, la trascrizione vocale su telefono o radio, ecc

i desiderata per una tale codifica sono:

  • minimizzazione errori di trascrizione - es il noto problema di confusione di "0" con "O"
  • incorporamento in altre strutture - ad es. motori di ricerca, strutturati o testo marcato, file system, shell di comando
  • brevità - Le stringhe [più corte] sono migliori di quelle più lunghe.
  • ergonomia - Gli utenti umani (specialmente quelli non tecnici) dovrebbero trovare le [stringhe] il più semplici e piacevoli possibile. Più brutto è il [stringhe], il peggio.
+0

Cheers, non penso che sia la base 64 Penso, È un codice che ppl può condividere (il 99% sarà copia e incolla) quindi importare nell'app, e saranno in grado di vedere quali elementi hanno (vero) o non avere (falso). Modifica: non voglio memorizzarlo in un BitArray poiché può crescere (l'elenco) in modo che le dimensioni possano aumentare, quindi è più facile utilizzare un elenco . Giusto: p? – Maximc

+0

Nel caso in cui: [Base32Encoding Implementation For .NET] (http://hemant-jangid.blogspot.com/2009/06/base32encoding-implementation-for-net.html) – dtb

+0

Io uso un elenco booleano in modo che la prima parte non lavoro, ma il resto lo fa, ma ho ancora bisogno di trovare un modo per ottenere il mio tmpboollist in Byte []. – Maximc

1

Per cominciare, è una cattiva idea per concatenare le stringhe in un ciclo del genere - almeno utilizzare StringBuilder, o usare qualcosa come questo con LINQ:

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

Ma la conversione stringa in un List<bool> è facile con LINQ, sfruttando il fatto che string implementa IEnumerable<char>:

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

Non è chiaro dove arriva la matrice di byte ... ma è should not try to represent arbitrary binary data in a string just using Encoding.GetString. Non è quello per cui è.

Se non vi interessa quale formato utilizza la stringa, quindi utilizzando Base64 funziona bene - ma essere consapevoli che se si sta raggruppando i valori booleani in byte, avrete bisogno di informazioni supplementari se è necessario distinguere tra "7 valori" e "8 valori, il primo dei quali è False" per esempio.

+0

Grazie per il gentile aiuto, ora non ho più bisogno di loop! :) – Maximc

1

Dato che sto infering dal codice si desidera una stringa con n cifre di 1 o 0 a seconda onthe liste valore interno bool allora come di ...

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

Attenzione questo è stato spento la scrittura del polsino, non l'ho ancora convalidato con un compilatore!

0

Questa funzione fa ciò che si vuole:

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