我的应用程序有一个自动更新功能。为了验证它是否成功下载了文件,我比较了两个哈希,一个是xml,另一个是下载后生成的哈希。两个哈希是一样的,但我发现两个哈希不一样。当我检查大小时,xml哈希字符串有66个,另一个是36个。我使用了trim方法,但还是运气不好。
string file = ((string[])e.Argument)[0];
string updateMD5 = "--"+((string[])e.Argument)[1].ToUpper()+"--";
string xx="--"+Hasher.HashFile(file, HashType.MD5).ToUpper()+"--";
// Hash the file and compare to the hash in the update xml
int xxx = (updateMD5.Trim()).Length;
int xxxxx = xx.Trim().Length;
if (String.Equals(updateMD5.Trim(), xx.Trim(), StringComparison.InvariantCultureIgnoreCase))
e.Result = DialogResult.OK;
else
e.Result = DialogResult.No;
哈希代码
internal static string HashFile(string filePath, HashType algo)
{
switch (algo)
{
case HashType.MD5:
return MakeHashString(MD5.Create().ComputeHash(new FileStream(filePath, FileMode.Open)));
case HashType.SHA1:
return MakeHashString(SHA1.Create().ComputeHash(new FileStream(filePath, FileMode.Open)));
case HashType.SHA512:
return MakeHashString(SHA512.Create().ComputeHash(new FileStream(filePath, FileMode.Open)));
default:
return "";
}
}
private static string MakeHashString(byte[] hash)
{
StringBuilder s = new StringBuilder();
foreach (byte b in hash)
s.Append(b.ToString("x2").ToLower());
return s.ToString();
}
StringBuilder s=new StringBuilder();
foreach (char c in updateMD5.Trim())
s.AppendLine(string.Format("{0}=={1}",c,(int)c));
一旦显示了较长字符串的字符对字符输出,说明就很清楚了。
至于为什么会发生这种情况,由于问题的性质,从我们的角度很难判断。
不管怎样,问题是这两个:
==8204
==8203
这两个代码点是0x200C和0x200B又名:
这些是不可见的字符,旨在为破字算法和类似的血淋淋的东西提供提示。
简单地说,在代码中连接字符串的某个地方,这两个字符是源代码的一部分。因为它们在源代码中也不可见(请记住,零宽度),所以很难发现。
我将查看此过程中涉及的所有字符串,特别是我将从用于构建哈希代码的格式字符串开始,或者可能是返回MD5代码以应用更新的代码。
问题内容: String[] letters = {“A”, “B”, “C”, “D”, “E”, “F”, “G”, “H”, “I”, “L”}; 为什么是 Fk呀! 输入AL字母之一绝对不会发生? 问题答案: 字符串是对象。所述通过引用,而不是由它们的内部值进行比较的对象。 有两种解决方案: 使用method来比较两个对象的值。 使用代替。这是原始的,因此可以使用。
问题内容: 我试图理解字符串比较与字符串比较的输出。需要明确的是,我拥有使用==和equals比较两个字符串的类。我试图将==和equals()的输出合并为字符串。equals()的输出会连续显示,但==的输出不会 连续显示。使用Java的装箱功能,将与字符串连接的布尔值联系起来。equals和==都返回布尔值。那么为什么会有这种差异呢?有人可以解释吗? 输出 更新:答案 如果不使用s1 == s
问题内容: String s1 = “andrei”; String s2 = “andrei”; 提供以下代码,为什么第二个比较s2 == s3为true?s2.toString()返回的实际上是什么?实际位于哪里? 问题答案: 首先是无操作: 其次,对String常量进行了插值,因此s1和s2在幕后被更改为相同的String实例。
问题内容: 请帮我,java中的string.equals如何与null值一起使用?例外情况有问题吗?三种情况: 结果的价值是什么?我期望这个值: result1为true; result2为假; result3为假; 问题答案: 您不能使用解引用(。)来访问实例变量或在实例上调用方法(如果该实例为)。这样做会产生一个。 通常,使用您知道为非null的东西进行字符串比较。例如,。
当使用and这两个都创建不同的String对象吗?我知道如果我使用它使用s1的相同对象,但在s2的情况下也使用相同的对象吗?如果是这样,那么为什么使用不同的对象。因为如果我做它返回false; 我对等于方法的理解是,它比较两个引用是否引用同一个对象,除非我们重写了等于方法,如果我的理解是错的,请告诉我。
这个问题更容易用代码内联解释: 我已经被困在这个舞台问题上好几天了。我似乎也找不到工作。有我看不到的差异吗?两个相等的字符串怎么会表现得如此不同呢。请帮帮我,我要发疯了,想办法解决这个问题! 我得到的具体例外是: 原因:java.io.NotSerializableException:org.apache.hadoop.hdfs.分布式文件系统序列化堆栈:-对象不可序列化(类:org.apache