2017-03-20 48 views
1

字符串我有以下Oracle PLSQL函數的ASCII字符串轉換爲數字:甲骨文 - 如何解碼轉換爲數字

function str2num 
(
    p_string in varchar2 
) return number is 

l_i  number(15); 
l_c  number(15); 
l_answer number(38); 

begin 

    l_answer := 0; 
    for l_i in 1..length(p_string) loop 
     l_c := ascii(substr(p_string, l_i, 1)); 
     l_answer := l_answer + (l_c * power(2, (l_i - 1) * 8)); 
    end loop; 

    return l_answer; 

end str2num; 

我想編寫一個函數來轉換數回字符串。

基本上函數轉換字符轉換成ASCII碼,然後移位由2^(char_pos-1)*8乘以二進制離開的值。

Chr Ascii Pos Pos - 1 Value Binary Value 
A 65 1 0 65  00000000000000001000001 
c 99 2 1 25344 00000000110001100000000 
e 101 3 2 6619136 11001010000000000000000 
      final sum =  6644545 11001010110001101000001 

我該怎麼辦相反的功能:

所以如下字符串「王牌」將被編碼?

+0

除以相同的量和使用'CHR()'函數。 –

+0

問題是你必須得到個人角色。 – Superdooperhero

+0

你可以用'MOD(值,除數)'來獲得最後一個字符的ASCII碼,使用'CHR()'來轉換回一個字符。然後用除數除數並丟棄餘數並重復該過程... –

回答

2
FUNCTION str2num(p_str IN VARCHAR2) RETURN NUMBER 
IS 
    p_num NUMBER(38,0) := 0; 
BEGIN 
    FOR i IN REVERSE 1 .. LEAST(LENGTH(p_str), 15) 
    LOOP          -- A NUMBER(38,0) can only fit 15 characters. 
    p_num := p_num + ASCII(SUBSTR(p_str, i, 1)) * POWER(256, i - 1); 
    END LOOP; 
    RETURN p_num; 
END str2num; 

FUNCTION num2str(p_num IN NUMBER) RETURN VARCHAR2 
IS 
    p_str VARCHAR2(15);      -- A NUMBER(38,0) can only fit 15 characters. 
    p_var NUMBER(38,0) := p_num; 
BEGIN 
    WHILE p_var > 0 LOOP 
    p_str := p_str || CHR(MOD(p_var, 256)); 
    p_var := FLOOR(p_var/256); 
    END LOOP; 
    RETURN p_str; 
END num2str; 
0

完美的「練習」遞歸函數!

您仍然需要寫一些錯誤處理;並且,由於number數據類型是有限的,它可能是更好的轉換和從二進制文件(而不是基地十)個數字,並寫入二進制數字符串而不是真實的數字,所以你有長度沒有限制。 (如果需要,使用CLOB)但這是一個不同的問題。

str2num

create or replace function str2num 
(
    p_string in varchar2 
) return number is 
begin 
    return ascii(substr(p_string, 1, 1)) 
      + case when length(p_string) = 1 then 0 
       else 256 * str2num(substr(p_string, 2)) end; 
end str2num; 
/

select str2num('Ace') from dual; 

STR2NUM('ACE') 
-------------- 
6644545 

num2str

create or replace function num2str 
(
    p_number in number 
) return varchar2 is 
begin 
    return chr(mod(p_number, 256)) 
      || case when p_number >= 256 then num2str(trunc(p_number/256)) end; 
end num2str; 
/

select num2str(6644545) from dual; 

NUM2STR(6644545) 
---------------- 
Ace