【发布时间】:2020-09-22 19:47:52
【问题描述】:
我有以下 .NET 代码生成文件 MD5 的 base64 字符串:
using (FileStream fileStream = new FileStream(fileName, FileMode.Open))
{
using (MD5 md5 = MD5.Create())
{
using (CryptoStream cryptoStream = new CryptoStream((Stream) fileStream, (ICryptoTransform) md5, CryptoStreamMode.Read))
{
byte[] buffer = new byte[4096];
do
;
while (cryptoStream.Read(buffer, 0, buffer.Length) > 0);
return Convert.ToBase64String(md5.Hash);
}
}
}
它是工作代码的一部分。
现在我需要创建一个 PowerShell 脚本来执行一些自动化操作,并且还需要创建文件的相同 base64 哈希。我写了以下内容:
$uploadFilePath = "C:\temp\test.txt"
$fileHashMD5 = Get-FileHash $uploadFilePath -Algorithm MD5
$bytes = [System.Text.Encoding]::ASCII.GetBytes($fileHashMD5.Hash)
$fileHashBase64 =[Convert]::ToBase64String($bytes)
但这会返回与上面生成的结果不同的结果。
我在 PS 脚本中做错了什么?
【问题讨论】:
-
您正在使用 7 位 US-ASCII 将十六进制字符串转换为与该十六进制字符串完全不匹配的字节
-
顺便说一句,.NET 代码也很古怪。您可以将ComputeHash(Stream) 与流一起使用,无需循环读取数据。你可以写
var bytes=md5.ComputeHash(fileStream); -
@PanagiotisKanavos 尝试过 - 仍然给出不同的结果
-
试过什么?你尝试了什么,你得到了什么?问题中的代码肯定是错误的。
Get-FileHash没有损坏。still gives different result表示十六进制字符串不同。他们是吗?如果不是,则是将一种字符串格式转换为另一种需要修复的代码 -
为什么不按原样使用十六进制字符串? Git 哈希是十六进制字符串,而不是 Base64
标签: .net powershell