我正在尝试将python程序移植到c#。这条线应该是一个演练,但目前正在折磨我:
hash = hashlib.md5(inputstring).digest()
在c#中生成类似的MD5哈希后,创建一个与原始python程序类似的哈希字符串或者我的整个应用程序都会失败是绝对至关重要的。
我的困惑在于在c#中转换为字符串时使用的编码,即
?Encoding enc = new ?Encoding();
string Hash =enc.GetString(HashBytes); //HashBytes is my generated hash
因为我在使用Encoding.Default时无法创建两个类似的哈希值,即
string Hash = Encoding.Default.GetString(HashBytes);
所以我想知道python的deafult hash.digest()编码会有帮助
修改
好吧也许更多的代码可以更清楚地表达我的问题。在python程序中计算散列后,进行一些计算,即
hash = hashlib.md5(inputstring).digest()
for i in range(0,6):
value += ord(hash[i])
return value
现在你能看出为什么两个不同的Hash字符串会有问题吗?运行python程序时出现的一些字符由'?'重新表示在C#。
答案 0 :(得分:5)
我认为你使用的是Python的早期版本而不是3,而你的字符串是正常的str
。
如果您正在讨论输出,则摘要方法返回一个由原始字节组成的字符串。 C#中的等效类型是byte[]
,您似乎已经拥有了它。它不是文本,所以使用Encoding类是没有意义的。
如果您正在讨论输入,md5
函数将采用正常的str
,这是一个字节字符串。在此之前,您必须先查看代码,以确定数据的编码方式。
修改强>
关于你发布的代码,它所做的只是将哈希中六个第一个字节的值加在一起。你应该能够弄清楚如何在C#中做到这一点。
并确保您了解字节字符串与字符字符串之间的区别。
答案 1 :(得分:2)
根本不编码,它只是两种语言中的字节数组。
答案 2 :(得分:0)
根据the documentation,Python字符串默认为ASCII。替代编码必须为explicitly specified。因此,您应该能够将ASCII字符串传递给C#MD5库并获取与将字符串传递到Python MD5库时相同的哈希字节。