将 word 转换为 ascii 并将 return 转换为添加一些值的 word

convert word to ascii and return to word adding some value

我正在研究 PL/SQL。开发者的oracle密码是这样设置的

=> input word => converted to ascii => added 2 to each letter => converted back to word

例如:输入的密码是"admin"。 admin 被拆分为 characters/letters (a, d, m, i, n) 转换为 ascii 并加 2 并再次转换为 word

a=97      97+2 = 99 = c
d=100     100+2=102 = f
m=109     109+2=111 = o
i=105     105+2=107 = k 
n=110     110+2=112 = p

我做的是

$pass=str_split('admin');

    foreach($pass as $password){
        $new_password[]=chr(ord($password)+2);
    }
$final= $new_password[0].$new_password[1].$new_password[2].$new_password[3].$new_password[4]; //the values 0-4 is set manually
echo $final;

结果:cfokp

但是我无法得到 运行 命令结果字符串的正确答案,也无法将 oracle 密码与检索到的密码相匹配。

使用 translate 可能更容易做到:

select translate('admin',
                 'abcdefghijklmnopqrstuvwxyz',
                 'cdefghijklmnopqrstuvwxyzab'
                )
from dual;

我不确定你想用 "y" 和 "z" 做什么。这会将它们映射回 "a" 和 "b"。如果需要,您可以将其扩展为大写字母和其他字符。

SQL中的另一种方式是拆分字符,将ascii值加2,聚合字符串。

当然,它不会比 TRANSLATE 方法快。但是,对于单个值或一小组值来说,这应该无关紧要。

例如,

SQL> WITH data AS
  2    (SELECT 'admin' str FROM dual
  3    )
  4  SELECT str, LISTAGG(CHR(ASCII(REGEXP_SUBSTR(str, '\w', 1, LEVEL)) + 2), '') WITHIN GROUP(
  5  ORDER BY LEVEL) str_new
  6  FROM data
  7    CONNECT BY LEVEL <= LENGTH(str)
  8  /

STR    STR_NEW
------ -------
admin  cfokp

SQL>

以上 SQL 执行以下重要任务:

  • 使用 REGEXP_SUBSTRROW GENERATOR 技术将字符串拆分为字符
  • 将值 2 添加到每个字符的 ascii 值。
  • 将修改后的 ascii 转换回 字符 .
  • 使用 LISTAGG
  • 聚合字符串