2009-02-12 10 views
6

An diesem Punkt die meisten Leute denken, „diese Ah krank Post ..:“C# umwandeln String in seine byte [] äquivalent

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

aber .. ich habe das Problem ist ich brauche den genauen Wert von die Bytes ohne Codierung nur den reinen Wert für jedes Byte. Zum Beispiel, wenn der Wert der Zeichenkette (0xFF32) ist, möchte ich es auch umwandeln {255,50}. Der Grund dafür ist, dass ich ein Dateiformat habe, das ich zu lesen versuche, das Int speichert, wie Bytes sie speichert und dann liest, wenn das Programm geöffnet wird. Diese

ist das, was ich bisher:

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

Also, wenn ich versuche, und lesen Sie die Datei es die Datei Klöster wandelt von sagen 0xFF in 0x3F weil 0xFF ist größer als 127 und 0x3F ist?.

Sorry, wenn ich scheine ein wenig verwirrend :)

Danke, Michael

Antwort

18

Das Problem ist, mit Ihrem Ansatz beginnen mit:

ich den genauen Wert des Bytes ohne Codierung benötigen

...

Zum Beispiel, wenn der Wert der Zeichenfolge (0xFF32)

, die ein bisschen ist wie bei einem Ölgemälde suchen und zu sagen: „Ich mag das Bytes für das Bild, ohne Codierung.“ Es macht keinen Sinn. Text ist nicht identisch mit Binärdaten. Sobald Sie das verstanden haben, ist es einfach, die Wurzel des Problems zu finden. Was Sie wirklich wollen, ist der Inhalt einer Datei als Byte-Array. Das ist einfach, denn Dateien sind Binärdaten! Sie sollten es nicht als Text an erster Stelle lesen, wenn es nicht wirklich Text ist. Glücklicherweise macht .NET dies ganz einfach:

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

Ich verstehe, wie Dateien Bit-Bytes und all das Shizzle arbeiten, weshalb ich imstande bin, (64) eine Ganzzahl als 8 Bytes zu speichern, wusste ich einfach nicht wie zu bekommen bei der Info :); thansk für Ihre Hilfe – redorkulated

+1

Aber behandeln eine Datei, als ob es Text enthält, wenn es nicht ist, ist ein grundlegendes Missverständnis, das * so * viele Leute brennt. Jedes Mal, wenn Sie anfangen, über "den Inhalt eines Strings als Bytes ohne eine Kodierung" nachzudenken, bedeutet dies fast sicher, dass ein Fehler lauert. –

+0

Ich betrachtete nicht die "Zeichenfolge" als Text in diesem Fall Ich versuchte, nur die reine Binärdatei als das ist, was die Datei speichert. Ich verstehe Ihren Punkt, obwohl, also danke :) – redorkulated

12

Allerdings .. das Problem, das ich habe, ist ich brauche den genauen Wert der Bytes ohne Codierung nur den reinen Wert für jedes Byte.

Dann verwenden:

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

Es gibt die Bytes als intern von .NET Strings gespeichert.

Aber das ist Codswallop: Eine Zeichenfolge ist immer mit einer bestimmten Codierung verknüpft und es gibt keinen Weg um sie herum. Das obige wird z.B. wenn die Datei ungültige Unicode-Codefolgen enthält (was passieren kann) oder durch Normalisierung. Da Sie offensichtlich wollen a string nicht lesen Sie einen. Lesen Sie die Datei stattdessen als Binärdaten.

1

Wenn Sie Bytes wollen, verwenden Sie einen Stream!

Warum um alles in der Welt mit einem TextReader?

EDIT:

Wie pro Ihr Beispiel: Sie öffnen eine Datei, so dass nur ein Filestream verwenden.

+1

hey, ich bin wirklich neu in C# fand nur ein Beispiel zum Lesen von Dateien und das ist was ich zusammengeschustert: P. Wusste nicht, dass Dateien auf andere Weise gelesen werden könnten :) – redorkulated

3

Warum überhaupt von String konvertieren? Könntest du nicht einfach den Inhalt der Datei direkt in Bytes lesen?

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

// einen String in ein Byte-Array konvertieren

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

// ein Byte-Array

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