我正在尝试在php5中复制一些C代码,但遇到了一些困难。
C代码如下,注意不能更改:
string s = strToHash;
UnicodeEncoding encoding = new UnicodeEncoding();
byte[] bytes = encoding.GetBytes(s);
SHA1Managed managed = new SHA1Managed();
bytes = encoding.GetBytes(Convert.ToBase64String(managed.ComputeHash(bytes)) + "Space");
return Convert.ToBase64String(managed.ComputeHash(bytes));
我编写的用于复制此内容的PHP代码如下:
utfString = mb_convert_encoding($strToHash,"UTF-16");
hashTag = sha1($utfString,true);
base64Tag = base64_encode($hashTag);
encodedBase64Tag = mb_convert_encoding($base64Tag."Space","UTF-16");
base64EncodedAgain = base64_encode($encodedBase64Tag);
echo $base64EncodedAgain
但是,这两个输出不匹配。
我认为这是因为PHP中的sha1方法适用于ASCII编码的字符串,而不是传入字符串实际使用的编码。
我想让它工作起来,但是我不能通过修改C代码来实现它(尽管这无疑是最简单的解决方法)。
有什么建议吗?
好吧,我已经按照artefacty的建议修改了代码,但它仍然没有按预期工作。
现在的PHP代码如下:
$utfString = "\xFF\xFE".mb_convert_encoding($strToHash,"UTF-16LE");
$hashTag = sha1($utfString,true);
$base64Tag = base64_encode($hashTag);
$encodedBase64Tag = "\xFF\xFE".mb_convert_encoding($base64Tag."Space","UTF-16LE");
$hashedAgain = sha1($encodedBase64Tag,true);
$base64EncodedAgain = base64_encode($hashedAgain);
echo $base64EncodedAgain."
";
此方法的输出值为:
1/Y5Mczi8vdjqc456yiicpwoyy0=
但是,根据C代码,值为:
vpf7bht1ksafwbzejw35g+bvkwy=