使用C#和Java进行编码

使用C#和Java进行编码,java,Java,我必须在Java和C#中使用相同的函数,但结果不一样 我的C#代码: string xmlString=System.IO.File.ReadAllText(@“crc.xml”); byte[]bytes=Encoding.ASCII.GetBytes(xmlString); //步骤1,从输入计算MD5散列 MD5 MD5=System.Security.Cryptography.MD5.Create(); byte[]hash=md5.ComputeHash(字节); //步骤2,将字节数

我必须在Java和C#中使用相同的函数,但结果不一样

我的C#代码:

string xmlString=System.IO.File.ReadAllText(@“crc.xml”);
byte[]bytes=Encoding.ASCII.GetBytes(xmlString);
//步骤1,从输入计算MD5散列
MD5 MD5=System.Security.Cryptography.MD5.Create();
byte[]hash=md5.ComputeHash(字节);
//步骤2,将字节数组转换为十六进制字符串
StringBuilder sb=新的StringBuilder();
for(int i=0;i
我的Java代码:

string xmlstring=Files.readString(path.get(“crc.xml”);
MessageDigest m=MessageDigest.getInstance(“MD5”);
byte[]digest=m.digest(xmlstring.getbytes());
字符串哈希=新的BigInteger(1,摘要).toString(16);
System.out.println(散列);
在C#中,我得到了以下结果:

F5F8B2F361FEA6EA30F24BEBAA5BDE3A

但在Java中,我得到了以下结果:

8fb40aad49fbf796b82a2faa11cda764

我做错了什么?

说出来。使用

byte[] bytes = Encoding.UFT8.GetBytes(xmlString);
而不是

byte[] bytes = Encoding.ASCII.GetBytes(xmlString);

我认为C#字节是无符号的,java字节是有符号的,这可能会导致差异C#正在使用Encoding.ASCII,但java使用UTF-8如果您想计算文件的MD5,您永远不应该将文件内容读入
字符串中,因为这已经包括一个解释级别(即解码字符集)这是不必要的,可能会对尝试造成积极的伤害。直接读取
byte[]
(或者更好的是,将
byte[]
数据流化,因为没有理由一次将其全部存储在内存中)。在Java中,直接替换将是
文件.readAllBytes()
。似乎.NET也有一个
ReadAllBytes
(我没有将此作为答案发布的唯一原因是,我不确定这是否是造成差异的具体原因,但这肯定是一个问题)。