没有Oracle 标签,很难看到这个问题。积极的赏金把我带到了这里。我希望这个问题也有其他相关的技术标签:-(
我主要和Oracle database一起工作,所以我会使用一些Oracle的知识来解释和解释:-)
让我们将数字4946144450195624 转换为binary。为此,我使用了一个名为 dec2bin 的小型 function,即 decimal-to-binary。
SQL> CREATE OR REPLACE FUNCTION dec2bin (N in number) RETURN varchar2 IS
2 binval varchar2(64);
3 N2 number := N;
4 BEGIN
5 while ( N2 > 0 ) loop
6 binval := mod(N2, 2) || binval;
7 N2 := trunc( N2 / 2 );
8 end loop;
9 return binval;
10 END dec2bin;
11 /
Function created.
SQL> show errors
No errors.
SQL>
让我们用函数来获取二进制值-
SQL> SELECT dec2bin(4946144450195624) FROM dual;
DEC2BIN(4946144450195624)
--------------------------------------------------------------------------------
10001100100100111110111111110111101100011000010101000
SQL>
现在要注意的是5-bit 转换。从右到左开始分组,每组 5 个数字。我们得到:-
100|01100|10010|01111|10111|11111|01111|01100|01100|00101|01000
我们最终将只剩下 3 个数字,他在右边结束。因为,我们在二进制转换中总共有 53 位。
SQL> SELECT LENGTH(dec2bin(4946144450195624)) FROM dual;
LENGTH(DEC2BIN(4946144450195624))
---------------------------------
53
SQL>
hello world 总共有 11 个字符(包括空格),所以我们需要在最后一个组中添加 2 位,分组后我们只剩下 3 位.
所以,现在我们有了:-
00100|01100|10010|01111|10111|11111|01111|01100|01100|00101|01000
现在,我们需要将其转换为 7 位 ascii 值。对于字符很简单,我们只需要设置第 6 位和第 7 位。将11 添加到左侧上方的每个 5 位组中。
这给出了:-
1100100|1101100|1110010|1101111|1110111|1111111|1101111|1101100|1101100|1100101|1101000
让我们解释一下二进制值,我将使用binary to decimal conversion function。
SQL> CREATE OR REPLACE FUNCTION bin2dec (binval in char) RETURN number IS
2 i number;
3 digits number;
4 result number := 0;
5 current_digit char(1);
6 current_digit_dec number;
7 BEGIN
8 digits := length(binval);
9 for i in 1..digits loop
10 current_digit := SUBSTR(binval, i, 1);
11 current_digit_dec := to_number(current_digit);
12 result := (result * 2) + current_digit_dec;
13 end loop;
14 return result;
15 END bin2dec;
16 /
Function created.
SQL> show errors;
No errors.
SQL>
让我们看看每个二进制值 -
SQL> set linesize 1000
SQL>
SQL> SELECT bin2dec('1100100') val,
2 bin2dec('1101100') val,
3 bin2dec('1110010') val,
4 bin2dec('1101111') val,
5 bin2dec('1110111') val,
6 bin2dec('1111111') val,
7 bin2dec('1101111') val,
8 bin2dec('1101100') val,
9 bin2dec('1101100') val,
10 bin2dec('1100101') val,
11 bin2dec('1101000') val
12 FROM dual;
VAL VAL VAL VAL VAL VAL VAL VAL VAL VAL VAL
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
100 108 114 111 119 127 111 108 108 101 104
SQL>
让我们看看它们是什么字符:-
SQL> SELECT chr(bin2dec('1100100')) character,
2 chr(bin2dec('1101100')) character,
3 chr(bin2dec('1110010')) character,
4 chr(bin2dec('1101111')) character,
5 chr(bin2dec('1110111')) character,
6 chr(bin2dec('1111111')) character,
7 chr(bin2dec('1101111')) character,
8 chr(bin2dec('1101100')) character,
9 chr(bin2dec('1101100')) character,
10 chr(bin2dec('1100101')) character,
11 chr(bin2dec('1101000')) character
12 FROM dual;
CHARACTER CHARACTER CHARACTER CHARACTER CHARACTER CHARACTER CHARACTER CHARACTER CHARACTER CHARACTER CHARACTER
--------- --------- --------- --------- --------- --------- --------- --------- --------- --------- ---------
d l r o w ⌂ o l l e h
SQL>
那么,我们在输出中得到了什么?
d l r o w ⌂ o l l e h
那是 hello⌂world 反过来。唯一的问题是空格。 @higuaro 在他的回答中很好地解释了原因。老实说,在我看到他的回答中给出的解释之前,我第一次尝试自己无法解释空间问题。