2017-01-28 3 views
0

У меня проблема с преобразованием этих байтов в символы ASCII, необходимо выполнить аналогичное преобразование с использованием Oracle PL/SQL, исходное - в MS SQLserver: Как преобразовать байты в символы ASCII, используя Oracle PL/SQL

/// </summary> 

/// <param name="blob"></param> 

/// <returns></returns> 

[Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true, IsPrecise = true)] 

public static String VarbinaryToVarchar(SqlBytes blob) 
{ 
    if (blob.IsNull) return null; 

    byte[] buffer = blob.Buffer; 
    char[] res = new char[buffer.Length * 2]; 
    for (int i = 0; i < buffer.Length; i++) 
    { 
     res[i * 2] = (char)((buffer[i] & 0xF) + 65); 
     res[i * 2 + 1] = (char)(((buffer[i] >> 4) & 0xF) + 65); 
    } 
    return new String(res); 
} 

Спасибо заранее, ребята!

+0

Вам нужна помощь только от людей, знакомых с SQL Server, или от людей, которые работают только с Oracle? Я не знаю, что должен делать ваш код; можете ли вы объяснить свое требование на общем языке? Неважно, как это разрешено в коде. – mathguy

+0

Является ли ваше требование, как перейти от двоичного к ascii в оракуле? – Jucan

+0

Проблема заключается в том, что я действительно не знаю, как этот алгоритм работает ... Я только что получил, что один и нужно сделать то же в Oracle ... Только то, что я знаю, что для ввода: 0000EB862CB8024892CD419A26BB3AE Это собирается дать мне выход: AAAALOGIMCILCAIEJNBEKJGCLIDLOK Просто нужно выяснить, как это работает ... –

ответ

0

Вы можете изучить использование встроенного в Oracle UTL_RAW в сочетании с HEXTORAW, а затем конвертировать шестнадцатеричный код. значение integer и добавьте «65». После этого CHR даст вам ASCII вы ожидаете:

declare 
    p_s_in varchar2(1000):= '0000EB862CB8024892CD419A26BB3AE'; 
    l_s_cmp varchar2(1000):= 'AAAALOGIMCILCAIEJNBEKJGCLIDLOK'; 
    l_s_out varchar2(1000) :=''; 
    p_pad binary_integer:=1; 
    l_cur1 char; 
    l_cur2 char; 
    l_cur_bi1 binary_integer; 
    l_cur_bi2 binary_integer; 
begin 

    l_cur1 := substr(p_s_in, 1,1); 
    l_cur2 := substr(p_s_in, 2, 1); 
    while (length(l_cur1)=1) 
    loop 
    l_cur_bi1 := UTL_RAW.cast_to_binary_integer(HEXTORAW(l_cur1))+65; 
    l_cur_bi2 := UTL_RAW.cast_to_binary_integer(HEXTORAW(l_cur2))+65; 

    dbms_output.put_line(l_cur2||'->'||chr(l_cur_bi2)||'?>'||substr(l_s_cmp, 1,1)); 
    l_s_cmp := substr(l_s_cmp, 2); 

    dbms_output.put_line(l_cur1||'->'||chr(l_cur_bi1)||'?>'||substr(l_s_cmp, 1,1)); 
    l_s_out:=l_s_out||chr(l_cur_bi2)||chr(l_cur_bi1); 
    -- end loop 
    p_s_in := substr(p_s_in, 3); 
    l_s_cmp := substr(l_s_cmp, 2); 
    l_cur1 := substr(p_s_in, 1, 1); 
    l_cur2 := substr(p_s_in, 2, 1); 
    end loop; 
    dbms_output.put_line(l_s_out); 
end; 
/

Я позволяю отладочный, потому что я не совсем уверен, что это то, что вы ищете. Вы дали нам результат, который немного отличается от того, что я получаю с вашим кодом: enter image description here ... у вас или я чего-то не хватает.