问题描述
作为个人练习,我一直在尝试在我正在编写的一个小程序中生成 SHA256 哈希值。我的计算机上有一个已加载到程序中的任意位图文件。某处有我无法识别的问题。我的程序返回的哈希值是 5EFFCC89AEA1922485CFA721194320D8895A4F31AC4AA5134AC2104C528033BA
,但是当我在完全相同的文件上运行 7-Zip 的 SHA256 工具时,它返回 D78859AD5651EB23A771C4763D03E65D64550C0660F7E182668586398CF02BF9
。这是我的代码:
var image = new Bitmap(@"C:\Users\1\image.bmp");
var stream = new MemoryStream();
image.Save(stream,ImageFormat.Bmp);
var hashedBytes = new SHA256Managed().ComputeHash(stream);
var hash = string.Concat(hashedBytes.Select(x => x.ToString("X2")));
看起来可能会导致问题的唯一代码是将图像转换为 MemoryStream
对象。但如果我理解正确的话,这实际上只是一个字节数组,所以它似乎不应该改变任何数据。
我的代码有什么问题?
解决方法
将图像写入内存流后,其位置将设置为流的末尾。如果您在该状态下将其传递给 ComputeHash()
,它将没有要散列的字节。
因此,在将流传递给 ComputeHash()
之前,您必须将位置重置为零:
var image = new Bitmap(@"C:\Users\1\image.bmp");
var stream = new MemoryStream();
image.Save(stream,ImageFormat.Bmp);
stream.Position = 0;
var hashedBytes = new SHA256Managed().ComputeHash(stream);
var hash = string.Concat(hashedBytes.Select(x => x.ToString("X2")));