浏览 2748 次
锁定老帖子 主题: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。 我就胸闷了,这是何解啊? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |