Pregunta

Tengo el siguiente código:

using (BinaryReader br = new BinaryReader(
       File.Open(FILE_PATH, FileMode.Open, FileAccess.ReadWrite)))
{
    int pos = 0;
    int length = (int) br.BaseStream.Length;

    while (pos < length)
    {
        b[pos] = br.ReadByte();
        pos++;
    }

    pos = 0;
    while (pos < length)
    {
        Console.WriteLine(Convert.ToString(b[pos]));
        pos++;
    }
}

El FILE_PATH es una const string que contiene la ruta de acceso al archivo binario que se lee. El archivo binario es una mezcla de números enteros y caracteres. Los números enteros son 1 bytes cada uno y cada personaje se escriben en el archivo como 2 bytes.

Por ejemplo, el archivo tiene los siguientes datos:

1HELLO COMO SE YOU45YOU BUSCAN GRAN // y así sucesivamente

Tenga en cuenta: Cada entero está asociada con la cadena de caracteres que le sigue. Así 1 se asocia con "hello how are you" y 45 con "usted está buscando grandes" y así sucesivamente.

Ahora se escribe el binario (no sé por qué, pero tengo que vivir con esto) de tal manera que '1' tendrá solamente 1 byte, mientras que 'H' (y otros caracteres) toman 2 bytes cada uno.

Así que aquí es lo que en realidad contiene el archivo:

0100480045..and etc. Aquí está el desglose:

01 es el primer byte para el número entero 1 0048 son los 2 bytes para 'H' (H es 48 en Hex) 0045 son los 2 bytes para 'E' (E = 0x45)

y así sucesivamente .. Quiero que mi consola para imprimir formato legible por humanos de este archivo: Eso lo quiero para imprimir "1 hello how are you" y luego "45 QUE ESTÁ BUSCANDO grande" y así sucesivamente ...

Es lo que estoy haciendo correcto? ¿Hay una manera más fácil / eficiente?  Mi línea Console.WriteLine (Convert.ToString (b [pos])); no hace más que imprime el valor entero y no el carácter real que quiero. Está bien para los números enteros en el archivo, pero entonces ¿cómo puedo leer a los personajes?

Cualquier ayuda sería muy apreciada. Gracias

¿Fue útil?

Solución

Creo que lo que busca es Encoding.GetString .

Debido a que su cadena de datos se compone de caracteres de 2 bytes, cómo puede obtener la cadena de salida es:

for (int i = 0; i < b.Length; i++)
{
  byte curByte = b[i];

  // Assuming that the first byte of a 2-byte character sequence will be 0
  if (curByte != 0)
  { 
    // This is a 1 byte number
    Console.WriteLine(Convert.ToString(curByte));
  }
  else
  { 
    // This is a 2 byte character. Print it out.
    Console.WriteLine(Encoding.Unicode.GetString(b, i, 2));

    // We consumed the next character as well, no need to deal with it
    //  in the next round of the loop.
    i++;
  }
}

Otros consejos

Puede utilizar cuerdas System.Text.UnicodeEncoding.GetString () que toma un [] matriz de bytes y produce una cadena.

me encontré con este enlace muy útil

  

Tenga en cuenta que esto no es lo mismo que acaba de copiar ciegamente los bytes desde la matriz de bytes [] en un trozo de la memoria y decir que es una cadena. El método GetString () debe validar los bytes y prohibir sustitutos no válidos, por ejemplo.

using (BinaryReader br = new BinaryReader(File.Open(FILE_PATH, FileMode.Open, FileAccess.ReadWrite)))
{    
   int length = (int)br.BaseStream.Length;    

   byte[] buffer = new byte[length * 2];
   int bufferPosition = 0;

   while (pos < length)    
   {        
       byte b = br.ReadByte();        
       if(b < 10)
       {
          buffer[bufferPosition] = 0;
          buffer[bufferPosition + 1] = b + 0x30;
          pos++;
       }
       else
       {
          buffer[bufferPosition] = b;
          buffer[bufferPosition + 1] = br.ReadByte();
          pos += 2;
       }
       bufferPosition += 2;       
   }    

   Console.WriteLine(System.Text.Encoding.Unicode.GetString(buffer, 0, bufferPosition));

}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top