2010-08-31 3 views
5

Ich hatte einige Probleme mit computeHash. Ich verwende sowohl computeHash (Stream) als auch computeHash (byte []). Aus irgendeinem Grund geben sie ein anderes Ergebnis zurück. Ich habe versucht, die byte [] in eine MemStream schreiben, aber Ergebnis war das gleiche bei der Verwendung von Byte []computeHash Byte [] und Stream-Differenz

FileStream zz = new FileStream(t.Filename, FileMode.Open, FileAccess.Read); 
StreamReader sr = new StreamReader(zz, Encoding.ASCII); 
byte[] data = Encoding.ASCII.GetBytes(sr.ReadToEnd()); 
MemoryStream memStream = new MemoryStream(data); 
byte[] test = md5hash.ComputeHash(memStream); 

mir die Datei, um sicherzustellen, geschlossen habe, dass die Suchposition am Startpunkt ist.

zz = new FileStream(t.Filename, FileMode.Open, FileAccess.Read); 
zz.Position = 0; 
byte[] test1 = md5hash.ComputeHash(zz); 

Irgendwelche Vorschläge? Meine einzige Vermutung ist, dass es entweder ein Encoding-Problem ist oder der Stream eine andere Größe hat.

Jede Hilfe würde wirklich geschätzt werden.

Mit besten Grüßen,
sunsation

+0

Gibt es Nicht-ASCII-Zeichen in der Datei? –

+0

Ja gibt es und das scheint das Problem zu sein. Aus irgendeinem seltsamen Grund dachte ich immer, dass ASCII 8 Bit bedeutet (erweitertes ASCII enthalten). Dank Dean. Ich werde das mit BinaryReader beheben – SunSatION

Antwort

2

Einige Dateikodierungen Zeichen versteckt haben eine Consumer-Anwendung des Dateiformats zu alarmieren. Eine Kombination ist:

ï » ¿

Ich habe eine Datei als UTF8 formatiert und lief die folgenden:

byte[] asciidata, streamdata; 
using (var zz = new FileStream("utf8.txt", FileMode.Open, FileAccess.Read)) 
{ 
    var sr = new StreamReader(zz, Encoding.ASCII); 
    asciidata = Encoding.ASCII.GetBytes(sr.ReadToEnd()); 
} 

using (var zz = new FileStream("utf8.txt", FileMode.Open, FileAccess.Read)) 
{ 
    streamdata = new byte[asciidata.Length + 3]; 
    zz.Read(streamdata, 0, streamdata.Length); 
} 

Die Variable asciidata enthielt die vier Zeichen in meiner Textdatei , aber streamdata enthielt die vier Zeichen mit den drei oben beschriebenen magischen Zeichen (für insgesamt sieben Zeichen ers).

Abschließend glaube ich, Ihr Verdacht, dass Kodierung verantwortlich ist, ist richtig.