论坛首页 入门技术论坛

DB2位运算

浏览 2747 次
锁定老帖子 主题:DB2位运算
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-01-10  
各位好,

这几天要用db2的函数、存储过程实现了一些位运算的功能,属于临时抱佛脚,现学现卖。
碰到一个问题,请教一下大伙儿。我的一个函数str_xor(source, key)中应用到了异或运算,就是将源字串source与key按字符作异或,并返回这个结果。按说偶次异或后,应该返回原始的字串。
比如:
‘abcdef’ 与 '世界'  异或后,得到一个字串,这个串显示是乱码。但用这个乱码再次去‘世界’异或后,应该得到原始的字串‘abcdef’。
用公式表示就是

  str_xor(str_xor(‘abcdef’, '世界'), '世界') = ‘abcdef’

以上到这边都是挺正常的。调用两次函数后,能够得到正确的源码字串。
问题来了。我把source中抽一个字母出来作为key,再作两次异或的话,得到的结果有些出乎意料:

  str_xor(str_xor(‘abcdef’, 'a'), 'a') = ‘Abcdef’

与key一样的这个字母‘a’变成了‘A’,着实令人费解。更加奇怪的是,我把key换成两位后,比如为‘ad’,又正常了。

  str_xor(str_xor(‘abcdef’, 'ad'), 'ad') = ‘abcdef’

带着这个疑问,我仔细查看了我的str_xor函数中的每一步,最后发现一个问题。

ascii(chr(0)) = 32
ascii(chr(32)) = 32

对于db2来说,ascii与chr应该可以看作是互逆函数。但对于0来说,显示得到了错误的结果32。我特地写了个程序把0-255都对比了一遍,只有这个郁闷的0得到的结果是不一样的,是32,其他都能正常还原。

我又特地试了java和oracle中的相似逻辑,java、oracle都是正常的,即ascii(chr(0)) = 0。

我就胸闷了,这是何解啊?
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics