我试图用VB.net复制这个PHP函数:
function getGiantsModMD5Hash($modFile)
{
$info = pathinfo($modFile);
// Add mod zip data
$fileContent = file_get_contents($modFile);
// Add basefile name string without extension
$fileContent .= basename($modFile, '.' . $info['extension']);
return md5($fileContent);
}
根据我的理解,函数FileSystem.ReadAllText最相当于PHP中的file_get_contents函数。但是当我使用它时它不起作用,它似乎只返回第一行。我尝试过添加Encoding.Default,Encoding.UTF8等等,似乎都没有。
这是我的阅读文件的代码(在这种情况下,它是.zip文件)
Dim createHash As String
createHash = My.Computer.FileSystem.ReadAllText(modsPath & modName & ".zip") & modName
Form1.TextBox1.Text = createHash ' Show result of ReadAllText to my eye
我知道如何才能让它发挥作用?
更新
这是"格式"我需要的数据:
PKHr�F���Q��U brand.dds훻
�1�W�4���o`ao�al��ZX��C|@��-A��)���b��:d�39's�hVQ9�G&�ɹ��3��]�q��j�:{����
�S�������a�e���ߵ[7����]�
......等等
这就是我打印PHP file_get_contents函数的结果时的样子。 (文件是.zip)
我需要做的是获取该信息并添加没有文件扩展名的文件名并计算MD5哈希值,因此我可以将该值与已存在的MD5哈希值进行比较。
我已经谷歌搜索了几个小时,现在大声寻找任何解决方案。使用PHP看起来如此简单但看起来几乎不可能用VB.NET复制? :(
答案 0 :(得分:1)
zip文件不是文本文件,因此请勿尝试使用它。区分文本数据和二进制数据至关重要 - 不仅仅是在这里,而是在所有地方。
散列文件很简单。不幸的是,当您添加文件名时会使事情稍微复杂一点,但它并不太糟糕。这里是C#代码,希望你能够轻松地移植到VB(你将使用完全相同的方法和类型):
byte[] HashFileWithName(string filename)
{
using (var md5 = Md5.Create())
{
using (var stream = File.OpenRead(filename))
{
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = stream.Read(buffer, 0, 1024)) != 0)
{
md5.TransformBlock(buffer, 0, bytesRead, null, 0);
}
string nameToHash = Path.GetFileNameWithoutExtension(filename);
md5.TransformFinalBlock(Encoding.UTF8.GetBytes(nameToHash));
return md5.Hash;
}
}
}
您可能需要调整文件名的编码,尽管除非文件名包含非ASCII字符,否则它不太重要。