2015-07-21 50 views
0

我在Oracle SQL中有一个函数,它对给定的输入进行了加扰。我需要解读它。解读sql中的字符串代码

我需要一个程序,它可以基本上颠倒下面的程序的输出。

source IN VARCHAR2 
sGARBLED VARCHAR2(510); 
index NUMBER; 
length NUMBER; 
onec NUMBER; 

BEGIN 
    length := LENGTH(source); 
    IF length > 255 THEN 
    length := 255; 
     END IF; 
index := 1; 
sGARBLED := ''; 

WHILE index <= length LOOP 
    onec := ASCII(SUBSTR(source, index, 1)) - 30; 
    IF (onec < 10) THEN 
     sGARBLED := sGARBLED || '0';  
    END IF; 
    sGARBLED := sGARBLED || CAST(onec AS VARCHAR2); 
    index := index + 1; 
    END LOOP; 

RETURN sGARBLED; 
END 
+0

这可能是不可能的。它从你的IF(onec <10)出现,你试图确保每个输入字符创建两个输出字符。但是,输入文本可能包含ASCII值大于130的字符,这意味着它们会在输出字符串中添加三个字符。 如果没有保证每个输入字符都映射到两个输出字符,那么就没有确定性的方法来解读它。 –

回答

0

如果您在加扰之前只允许您的原始字符串中的字符值成为字母表中的字符,那么这是可能的。

代码会是这个样子:

sgarbled in VARCHAR2 
UNsGARBLED VARCHAR2(255); 

length NUMBER; 
index NUMBER; 
onec NUMBER; 

BEGIN 
length := LENGTH(sgarbled); 
index := 1; 
UNsGARBLED := ''; 

WHILE index <= length LOOP 
onec := SUBSTR(sgarbled, index, 1); 
    IF (onec = '0') THEN 
     onec := SUBSTR(sgarbled, (index + 1), 1) + 30; 
    ELSE 
     onec := SUBSTR(sgarbled, (index), 2) + 30; 
    END IF; 
    UNsGARBLED := UNsGARBLED || CAST(CHR(onec) AS VARCHAR2); 
    index := index + 2; 
    END LOOP; 

RETURN UNsGARBLED; 
END 

由于骆驼先生指出,如果允许原始输入字符串包含所有ASCII字符则可能是不可能的。

+0

谢谢你的程序。它非常有帮助。在实际的程序中,源字符串正在转换为ASCII。我们如何将它从ASCII转换回来。 – Photops

+0

源字符串最初只允许为字母表中的字符吗?或任何其他字符串的限制? – Phillip

+0

您可以使用CHR()将ASCII值转换回它引用的符号。 – Phillip