2012-02-10 29 views
6

Tengo una lista booleana con 92 booleanos, quiero que la lista se convierta en una cadena, pensé que tomaría 8 booleanos (bits) y los pondría en un byte (8 bits) y luego usa el ASCII para convertir el valor del byte en un char y luego agrega los caracteres a una cadena. Sin embargo, después de googeling por más de 2 horas, no hay suerte atm. Traté de convertir la lista a una lista de bytes, pero tampoco funcionó ^^.Convertir la lista <boolean> a la Cadena

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

PD Si alguien tiene una idea mejor sobre cómo codificar & decodificar una lista de Boole a una cadena? (Porque quiero que la gente comparta su lista booleana con una cadena en lugar de una lista de 90 1 y 0.)

EDITAR: lo tengo funcionando ahora! ty todo por ayudar a

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) 

Voy a mirar en los encoding32 más tarde, Ty por toda la ayuda de nuevo :)

+0

que necesita para ser más específicos en lo que usted quiere que su cadena se vea como –

+0

No está claro lo que se quiere terminar con. ¿Una cadena que es una codificación ascii de bits, que luego se puede volver a convertir en booleanos? – jlew

+1

'Encoding.Default.GetBytes' no hace lo que crees que hace. Consulte esta pregunta: http://stackoverflow.com/questions/2989695/how-to-convert-a-string-of-bits-to-byte-array –

Respuesta

13

Debe almacenar sus valores booleanos en un BitArray.

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

A continuación, puede convertir el BitArray a una matriz de bytes

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

y la matriz de bytes en una cadena Base64

var result = Convert.ToBase64String(bytes); 

la inversa, puede convertir una cadena Base64 a una matriz de bytes

var bytes2 = Convert.FromBase64String(result); 

y la matriz de bytes a un BitArray

var values2 = new BitArray(bytes2); 

La cadena de base 64 tiene el siguiente aspecto: "Liwd7bRv6TMY2cNE". Esto es probablemente un poco desagradable para compartir entre personas; echar un vistazo a human-oriented base-32 encoding:

utilización prevista de estas [base-32 cuerdas] incluyen y pegar, la edición de texto CUT (por ejemploen archivos HTML), la transcripción manual a través de un teclado, la transcripción manual a través de lápiz y papel, la transcripción vocal sobre teléfono o radio, etc.

El desiderata para una codificación de este tipo son:

  • minimización errores de transcripción, por ejemplo el conocido problema de confundir '0' con 'O'
  • incrustación en otras estructuras, p. motores de búsqueda, estructurados o texto marcado, sistemas de archivos, comandos shells
  • brevedad - [Las cadenas] más cortas son mejores que las más largas.
  • ergonomía - Los usuarios humanos (especialmente los no técnicos) deben encontrar el [cuerdas] lo más fácil y agradable posible. Cuanto más feo se ve [cuerdas], peor.
+0

Saludos, no me importa, es la base 64, creo, es un código que las personas pueden compartir (el 99% será copiar y pegar) luego importarlo en la aplicación, y podrán ver qué elementos tienen (verdadero) o no tiene (falso). Editar: No quiero almacenarlo en un BitArray ya que puede crecer (la lista) por lo que el tamaño puede aumentar, por lo que es más fácil usar una lista . Derecha: p? – Maximc

+0

Por las dudas: [Implementación de Base32Encoding para .NET] (http://hemant-jangid.blogspot.com/2009/06/base32encoding-implementation-for-net.html) – dtb

+0

Uso una lista booleana así que la primera parte no t trabajo, sin embargo, el resto lo hace, pero todavía necesito encontrar una forma de que mi tmpboollist pase a Byte []. – Maximc

1

Para empezar, es una mala idea para concatenar cadenas en un bucle como que - al menos utilizar StringBuilder, o usar algo como esto con LINQ:

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

Pero la conversión de su cadena a un List<bool> es fácil con LINQ, usando el hecho de que string implementa IEnumerable<char>:

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

No está claro dónde entra la matriz de bytes ... pero usted should not try to represent arbitrary binary data in a string just using Encoding.GetString. Para eso no es para eso.

Si no le importa el formato que utiliza la cadena, usar Base64 funcionará bien, pero tenga en cuenta que si agrupa sus valores booleanos en bytes, necesitará información adicional si necesita distinguir entre "7 valores" y "8 valores, el primero de los cuales es falso", por ejemplo.

+0

Gracias por la buena ayuda, ¡Ahora ya no necesito bucle! :) – Maximc

1

Desde que estoy infering de su código que quieren una cadena con n dígitos de 1 o 0 dependiendo enel valor bool listas internas entonces ¿qué ...

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

ADVERTENCIA Este estaba apagado la tipificación del brazalete, ¡no he validado esto con un compilador todavía!

0

Esta función hace lo que quiere:

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