在给定的序列中将二进制转换为十进制

Mah*_*kar 3 sql oracle binary

我需要将二进制数转换为十进制数.转换后的小数范围不大于256.(二进制1亿)

它涉及一个iOS应用程序,在哪里阅读问题调查报告,动态选择四个二进制整数并基于它.(内部的一些UI内容为0和1).

然后,我们将它们与''连接起来.as delimiter.(类似于IP地址)
基于最终形成的Sequence,我们在将它们转换为小数后获取报告ID.

说,10.100.1.11(输入)可能成为2.4.1.3(输出)

一直在经历众多报告和Objective-C.字面上失去了理智.在iOS开发中,我无法编译PL/SQL.所以,我必须用SQL完成.

编辑:

幸运的是,我能够写出这样的东西.(但一次只有一个数字:()

SQL> var NUM number;
SQL> exec :NUM := 100000000;

PL/SQL procedure successfully completed.

SQL> SELECT SUM(value)
FROM
  (SELECT POWER(2,LENGTH(TO_CHAR(:NUM))-level)*to_number(SUBSTR(TO_CHAR(:NUM),level,1),'FM9') AS value
  FROM DUAL
    CONNECT BY level <= LENGTH(TO_CHAR(:NUM))
  );  2    3    4    5    6

SUM(VALUE)
----------
       256
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 6

有不同的方法可以解决这个问题.所以,我选择看起来像是一种相当神秘的方式.这样做的动机是to_number()接受十六进制格式而不是二进制格式.支持二进制和八进制以及十六进制会有什么困难?嗯,这不是我要问的问题.甲骨文没有.

但是,我们可以轻松地从二进制转换为十六进制.您只处理8个二进制数字,因此只有两个十六进制数字.这是代码:

with bin2hex as (
      select '0000' as bin, '0' as hex from dual union all
      select '0001' as bin, '1' as hex from dual union all
      select '0010' as bin, '2' as hex from dual union all
      select '0011' as bin, '3' as hex from dual union all
      select '0100' as bin, '4' as hex from dual union all
      select '0101' as bin, '5' as hex from dual union all
      select '0110' as bin, '6' as hex from dual union all
      select '0111' as bin, '7' as hex from dual union all
      select '1000' as bin, '8' as hex from dual union all
      select '1001' as bin, '9' as hex from dual union all
      select '1010' as bin, 'A' as hex from dual union all
      select '1011' as bin, 'B' as hex from dual union all
      select '1100' as bin, 'C' as hex from dual union all
      select '1101' as bin, 'D' as hex from dual union all
      select '1110' as bin, 'E' as hex from dual union all
      select '1111' as bin, 'F' as hex from dual
     )
select t.*, c1.bin as bin1, c2.bin as bin2, c1.hex as hex1, c2.hex as hex2,
       to_number(c2.hex||c1.hex, 'xx')
from (select '10010010' as num from dual union all
      select '10010' from dual
     ) t left outer join
     bin2hex c1
     on substr('00000000'||t.num, -4) = c1.bin left outer join
     bin2hex c2
     on substr('00000000'||t.num, -8, 4) = c2.bin;
Run Code Online (Sandbox Code Playgroud)