我试图将这些功能从AS2转换为PHP,但是我没有运气。
这是原始的AS2函数:
enc.charsToLongs = function (chars)
{
var _loc3 = chars;
var tlength = Math.ceil(_loc3.length / 4);
var temp = [];
var _loc2 = 0;
for (var _loc1 = 0; _loc1 < tlength; ++_loc1)
{
_loc2 = _loc1 * 4;
temp[_loc1] = (_loc3[_loc2] << 24) + (_loc3[_loc2 + 1] << 16) + (_loc3[_loc2 + 2] << 8) + _loc3[_loc2 + 3];
}
return (temp);
};
这是我在PHP中拥有的:
function charsToLongs($chars)
{
$_loc3 = $chars;
$tlength = ceil(count($_loc3) / 4);
$temp = array();
$_loc2 = 0;
for ($_loc1 = 0; $_loc1 < $tlength; $_loc1++) {
$_loc2 = $_loc1 * 4;
$temp[$_loc1] = ($_loc3[$_loc2] << 24) + ($_loc3[$_loc2 + 1] << 16) + ($_loc3[$_loc2 + 2] << 8) + $_loc3[$_loc2 + 3];
}
return ($temp);
}
[每当我运行这些函数时,两者都会得到不同的答案。我知道AS2可以很好地工作,因为我已经多次使用它来加密/解密字符串。还有更多功能,但这似乎是我唯一坚持的功能。有人可以告诉我怎么了吗?
也:chars($ chars / chars)是我要加密的字符串的字符ASCII值的数组。
谢谢。
您需要使用ord()
和chr()
(或pack()
if you want to be cache-timing safe)将字符串转换为int,以便使用移位操作。
// Wrong:
var_dump(
($_loc3[$_loc2] << 24) + ($_loc3[$_loc2 + 1] << 16) + ($_loc3[$_loc2 + 2] << 8) + $_loc3[$_loc2 + 3]
);
// Right:
var_dump(
(ord($_loc3[$_loc2]) << 24) + (ord($_loc3[$_loc2 + 1]) << 16) + (ord($_loc3[$_loc2 + 2]) << 8) + ord($_loc3[$_loc2 + 3])
);