2010-08-31 21 views
5

J'ai eu quelques problèmes avec computeHash. J'utilise à la fois computeHash (Stream) et computeHash (octet []). Pour une raison quelconque, ils donnent des résultats différents. Je l'ai essayé d'écrire l'octet [] dans un MemStream mais le résultat était le même lors de l'utilisation Byte []computeHash byte [] et différence de flux

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

J'ai fermé le dossier pour vous assurer que la position à rechercher le point de départ.

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

Des suggestions? Ma seule supposition est que c'est un problème d'encodage ou que le Stream a une taille différente.

Toute aide serait vraiment appréciée.

Cordialement,
SunSation

+0

Y a-t-il des caractères non-ASCII dans le fichier? –

+0

Oui, il y a et cela semble être le problème. Pour une raison étrange, j'ai toujours pensé que ASCII signifie 8 bits (ASCII étendu inclus). Merci Dean. Je vais corriger cela en utilisant BinaryReader – SunSatION

Répondre

2

Certains encodages de fichiers ont des caractères cachés pour alerter une application consommateur du format de fichier. Une combinaison est:

ï » ¿

J'ai un fichier au format UTF8, et a couru les éléments suivants:

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

La asciidata variable contenue quatre caractères dans mon fichier texte , mais streamdata contenait les quatre caractères préfixés par les trois caractères magiques décrits ci-dessus (pour un total de sept caractères ers). En conclusion, je crois que votre soupçon que l'encodage est à blâmer est correct.