高手请关注:WinCE6 用C#程序进行2个文件比较,使用Hashcode计算值比较就可能失败,但是用byte比较却通过。请问什么原因?

cherry9400 2012-01-04 02:41:09
先生成一个由ramdom的数据产生的大约3M的文件。
然后复制这个文件。
然后进行这2个文件的对比。

我的问题是,如果用Hashcode比较,在某些时候可以通过,比如生成和复制文件到CE的temp文件夹下。但是有些时候不成功,比如生成和复制文件到SD卡中。
大致的代码思路如下:


bytes = new byte[1];
rand.NextBytes(bytes);
newFile.Append(bytes[0], 2000000 + rand.Next(1000000, 2000000));

//ComputeHash from firstFile and get a byte[].
//System.Security.Cryptography.HashAlgorithm
FileStream fs1 = File.Open(firstFile);
String hash1 = String.Empty;
foreach (byte b in HashAlgorithm.ComputeHash(fs1)) hash1 += b.ToString("x2").ToLower();

//copy from firstFile to secondFile
fInfo.CopyTo(secondFile, true);

//ComputeHash from secondFile and get a byte[].
FileStream fs2 = File.Open(secondFile);
String hash = String.Empty;
foreach (byte b in HashAlgorithm.ComputeHash(fs2)) hash2 += b.ToString("x2").ToLower();

//compare two hash
if (!hash2.Equals(hash1))
{
//fail
}


可是另外写了一段代码,只是用简单的byte来一个一个比较。不论在哪个盘上,都是通过的。

private bool FileCompare(string file1Path, string file2Path)
{
//if two file are point to one file. it is same
if(file1Path == file2Path)
{
return true;
}

int file1byte = 0;
int file2byte = 0;

using(FileStream fs1 = new FileStream(file1Path, FileMode.Open),
fs2 = new FileStream(file2Path, FileMode.Open))
{
if(fs1.Length != fs2.Length)
{
fs1.Close();
fs2.Close();
return false;
}

do
{
//read each byte from each file
file1byte = fs1.ReadByte();
file2byte = fs2.ReadByte();
}
while ((file1byte == file2byte) && (file1byte != -1));

fs1.Close();
fs2.Close();

return ((file1byte - file2byte) == 0);
}
}


是什么导致hashcode的比较会失败?
另外,奇怪的是相同的代码在Windows Mobile6 或者是WinCE5 却不会出现问题。两个方式进行比较都是通过的。
...全文
98 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingmax54212008 2012-01-07
  • 打赏
  • 举报
回复
Binary比较即可
当我遇上-你 2012-01-04
  • 打赏
  • 举报
回复
BYTE 是正确的
91program 2012-01-04
  • 打赏
  • 举报
回复
字节比较是对的,只能说明是程序的问题
skylkj 2012-01-04
  • 打赏
  • 举报
回复


String hash = String.Empty;
foreach (byte b in HashAlgorithm.ComputeHash(fs2)) hash2 += b.ToString("x2").ToLower();

你这里上面申明的是hash不是hash2,你的hash2在哪里?全局的?那执行的时候就没有 = String.Empty;的初始化了
skylkj 2012-01-04
  • 打赏
  • 举报
回复
你先把hash1和hash2输出出来看下哪里不一样
资源下载链接为: https://pan.quark.cn/s/abbae039bf2a 在计算机科学领域,编译原理是研究如何将编程语言转化为机器可执行代码的理论基础。其中,三地址代码(Three-Address Code,TAC)作为一种中间表示形式,在编译器设计中经常被使用,尤其是在生成目标代码的阶段。本文将深入探讨三地址代码的概念、生成器的工作原理及其在编译过程中的作用。 三地址代码是一种简单的低级抽象语法树(AST)表示,每条指令涉及三个操作数,通常包括两个源操作数和一个目的操作数。这种格式简化了代码优化和目标代码生成的复杂性。例如,一个简单的算术表达式“x = y + z”在三地址代码中可能表示为: 在这个例子中,“t1”是一个临时变量,存储了“y + z”的结果,然后这个结果被赋给“x”。 生成三地址代码的过程通常发生在编译器的中间阶段,即语法分析之后,语义分析之前。这个阶段称为“代码生成”或“中间代码生成”。编译器通过词法分析器处理源代码,将其转化为标记流;接着,语法分析器根据上下文无关文法将标记流解析成抽象语法树。三地址代码生成器就是在这个阶段介入,它遍历AST,为每个节点生成对应的三地址指令。 在Turbo C3.0这样的编译器环境下,开发者可以实现自己的三地址代码生成器。虽然Turbo C3.0是一款较老的编译器,但其C语言编译器设计原理依然适用于现代编译器开发。开发过程中,我们需要考虑如下关键点: 符号表管理:符号表记录了程序中所有标识符的类型、作用域和关联地址,对于生成三地址代码至关重要,因为它提供了关于操作数的类型信息。 数据类型转换:编译器必须处理不同数据类型的运算,确保它们在三地址代码中正确表示。例如,整型与浮点型之间的转换需要特别处理。

19,519

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧