2009-02-12 24 views
6

En este punto, la mayoría de la gente va a estar pensando "Ah mal puesto esto ..:"C# convierten cadena en su byte [] equivalente

byte[] dataB= System.Text.Encoding.ASCII.GetBytes(data); 

Sin embargo .. el problema que tengo es que necesito el valor exacto de los bytes sin codificación solo el valor puro para cada byte. Por ejemplo, si el valor de la cadena es (0xFF32), quiero que también lo convierta {255,50}. La razón de esto es que tengo un formato de archivo. Estoy intentando leer qué tiendas de int como bytes los guarda y luego los lee cuando se abre el programa.

Esto es lo que tengo hasta ahora:

... 
dialog.InitialDirectory = 
    Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop) + 
    "/Test"; 

dialog.Title="Open File"; 

if (dialog.ShowDialog(this) == DialogResult.OK) 
{ 
    StreamReader reader = new StreamReader(dialog.FileName); 
    string data = reader.ReadToEnd(); 
    reader.Close(); 
    byte[] fileC = System.Text.Encoding.ASCII.GetBytes(data); 
    File_Read(dialog.FileName,fileC); 
} 
... 

Así que cuando trato de leer el archivo que convierte los archivos de conventos decir 0xFF 0xFF en 0x3F porque es mayor que 127 y 0x3F es un?.

Lo siento si me parece un poco confuso :)

Gracias, Michael

Respuesta

18

El problema es con su enfoque para comenzar con:

necesito el valor exacto de los bytes sin codificación

...

Por ejemplo, si el valor de la cadena es (0xFF32)

que es un poco como mirar una pintura al óleo y diciendo: "Quiero que los bytes para ese cuadro, sin codificación." No tiene sentido. El texto no es lo mismo que los datos binarios. Una vez que comprenda eso, es fácil llegar a la raíz del problema. Lo que realmente desea es el contenido de un archivo como una matriz de bytes. Eso es fácil, ¡porque los archivos son datos binarios! No debería leerlo como texto en primer lugar si realmente no es texto. Afortunadamente, .NET lo hace muy fácil:

byte[] fileC = File.ReadAllBytes(dialog.FileName); 
+0

entiendo cómo funcionan los bits de bits de los bits y todo lo que funciona, por eso no entiendo el almacenamiento (por ejemplo) un entero de 64 bits como 8 bytes. Simplemente no sé cómo obtener en la información :); thansk por su ayuda – redorkulated

+1

Pero tratar un archivo como si contuviera texto cuando no lo hace es un malentendido fundamental que quema * a tantas personas. Cada vez que comienzas a pensar en "el contenido de una cadena como bytes sin una codificación", eso casi seguro significa que hay un error al acecho. –

+0

no estaba viendo la "cadena" como texto en esta instancia, estaba tratando de obtener el binario puro, ya que eso es lo que el archivo está almacenando. Aunque entiendo tu punto, así que gracias :) – redorkulated

12

Sin embargo ... el problema que tengo es que necesito el valor exacto de los bytes sin codificación, solo el valor puro para cada byte.

A continuación, utilice la siguiente:

byte[] dataB = System.Text.Encoding.Unicode.GetBytes(data); 

Devuelve los bytes que almacena internamente por cadenas de .NET.

Pero todo esto es codswallop: Una cadena es siempre vinculada a una codificación particular y no hay forma de evitarla. Lo anterior fracasará, p. si el archivo contiene secuencias de códigos Unicode no válidas (lo que puede suceder) o mediante la normalización. Dado que obviamente no desea quiere a string, no lea uno. Lea el archivo como datos binarios en su lugar.

1

Si quieres bytes, usa un Stream!

¿Por qué diablos te estás metiendo con un TextReader?

EDIT:

Como por su ejemplo, que está abriendo un archivo, por lo que sólo tiene que utilizar un FileStream.

+1

hey, soy realmente nuevo en C#, acabo de encontrar un ejemplo para leer archivos y eso es lo que construí: P. No sabía que los archivos se podían leer de otra manera :) – redorkulated

3

¿Por qué convertir de cadena en absoluto? ¿No podría simplemente leer el contenido del archivo directamente en bytes?

byte[] fileC = File.ReadAllBytes(dialog.FileName); 
11

// convertir una cadena en una matriz de bytes

public static byte[] StrToByteArray(string str) 
{ 
    System.Text.UTF8Encoding encoding=new System.Text.UTF8Encoding(); 
    return encoding.GetBytes(str); 
} 

// convertir una matriz de bytes en una cadena

public string ByteArrayToStr(byte [] dBytes) 
{ 
System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); 
return enc.GetString(dBytes); 
}