我在读完有关Jon Skeet的有趣内容之后发现了一个字符串,我猜这是在ROT13中。在检查我的猜测之前,我想我会尝试用PHP解密它。这就是我所拥有的:
$string = "Vs lbh nfxrq Oehpr Fpuarvre gb qrpelcg guvf, ur'q pehfu lbhe fxhyy jvgu uvf ynhtu.";
$tokens = str_split($string);
for ($i = 1; $i <= sizeof($tokens); $i++) {
$char = $tokens[$i-1];
for ($c = 1; $c <= 13; $c++) {
$char++;
}
echo $char;
}
我的字符串以AIaf you aasakaead ABruacae Sacahnaeaiaer to adaeacrypt tahais, ahae'ad acrusah your sakualal waitah ahais alaauagah.
我的逻辑似乎很接近,但显然是错的。你能帮帮我吗?
答案 0 :(得分:7)
答案 1 :(得分:3)
这是一个有效的实现,不使用嵌套循环。您也不需要将字符串拆分为数组,因为您可以像使用PHP中的字符串数组一样索引单个字符。
您需要知道ASCII大写字符的范围是65 - 99,小写字符的范围是97 - 122.如果当前字符位于其中一个范围内,则将ASCII值加13。然后,检查是否应该转到字母表的开头。如果你应该翻身,减去26。
$string = "Vs lbh nfxrq Oehpr Fpuarvre gb qrpelcg guvf, ur'q pehfu lbhe fxhyy jvgu uvf ynhtu.";
for ($i = 0, $j = strlen( $string); $i < $j; $i++)
{
// Get the ASCII character for the current character
$char = ord( $string[$i]);
// If that character is in the range A-Z or a-z, add 13 to its ASCII value
if( ($char >= 65 && $char <= 90) || ($char >= 97 && $char <= 122))
{
$char += 13;
// If we should have wrapped around the alphabet, subtract 26
if( $char > 122 || ( $char > 90 && ord( $string[$i]) <= 90))
{
$char -= 26;
}
}
echo chr( $char);
}
这会产生:
如果你让布鲁斯施奈尔解密这个问题,他会笑着碾碎你的头骨。
答案 2 :(得分:2)
如果您想自己执行此操作,而不是使用现有解决方案,则需要检查每个字母是否位于字母表的第一个或后半部分。你不能天真地为每个角色添加13(也就是你为什么要使用循环来添加13?!)。您必须将13添加到A-M并从N-Z中减去13。你也必须,不要改变任何其他角色,比如空间。
在更改代码之前,请更改代码以检查每个字符的内容,以便了解是否以及如何更改它。
答案 3 :(得分:2)
这不起作用,因为z ++是aa
$letter = "z";
$letter++;
echo($letter);
返回aa而不是
编辑:不使用内置的替代解决方案是
$string = "Vs lbh nfxrq Oehpr Fpuarvre gb qrpelcg guvf, ur'q pehfu lbhe fxhyy jvgu uvf ynhtu.";
$tokens = str_split($string);
foreach($tokens as $char)
{
$ord = ord($char);
if (($ord >=65 && $ord <=90 ) || ($ord >= 97 && $ord <= 122))
$ord = $ord+13;
if (($ord > 90 && $ord < 110) || $ord > 122)
$ord = $ord - 26;
echo (chr($ord));
}
答案 4 :(得分:0)
参加派对已经晚了几年,但我想我会再给你一个选择
function rot13($string) {
// split into array of ASCII values
$string = array_map('ord', str_split($string));
foreach ($string as $index => $char) {
if (ctype_lower($char)) {
// for lowercase subtract 97 to get character pos in alphabet
$dec = ord('a');
} elseif (ctype_upper($char)) {
// for uppercase subtract 65 to get character pos in alphabet
$dec = ord('A');
} else {
// preserve non-alphabetic chars
$string[$index] = $char;
continue;
}
// add 13 (mod 26) to the character
$string[$index] = (($char - $dec + 13) % 26) + $dec;
}
// convert back to characters and glue back together
return implode(array_map('chr', $string));
}