在线等待!!!--------- 解决思路

lianda220 2009-11-27 11:23:12
问题是这样的:
IP地址封包的标头(header)的TOS是一个由8位二进制数组成 现在在数据库里有一个字段存储TOS(已整数形式存储的)
现在有一个需求 标志位| URG|ACK|PUSH|RST|SYN|FIN 其中FIN...都是复选框,根据选取的标志位去数据库中查找数据

其中标志位与TOS的关系是: 1 2 3 4 5 6 7 8(TOS位数)
| | | | | |
URG ACK PUSH RST SYN FIN

请高人给个思路,谢谢...
...全文
460 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lianda220 2009-11-30
  • 打赏
  • 举报
回复
谢谢大家
把麻烦留给程序比留给数据库效率高。 


bit URG|ACK|PUSH|RST|SYN|FIN =0;
//获取参数,将选定修改为1.
int sum=FIN*(2^7)+SYN*(2^6)....;//累加

sql语句:
SELECT * FROM table WHERE TOS=sum


这个解决不了我的实际需求
mysql那就更好用了. 
&, |, ~, ^, < <, >>分别是与, 或, 非, 异或, 左移位, 右移位, 和普通编程语言中一样使用

再次谢谢
goosman 2009-11-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lingling1989r 的回复:]
把麻烦留给程序比留给数据库效率高。


bit URG|ACK|PUSH|RST|SYN|FIN  =0;
//获取参数,将选定修改为1.
int sum=FIN*(2^7)+SYN*(2^6)....;//累加

sql语句:
SELECT * FROM table WHERE TOS=sum


[/Quote]

把麻烦留给程序比留给数据库效率高。


这个问题有确凿的证据吗? 我也只是听一些前辈讲能用数据库提供的库函数实现的尽量用数据库的实现, 关于这个问题, 没有一个有效的数据来支持....

如果楼上有数据, 请提供, 方便大家共同走出误区.
lingling1989r 2009-11-29
  • 打赏
  • 举报
回复
把麻烦留给程序比留给数据库效率高。


bit URG|ACK|PUSH|RST|SYN|FIN =0;
//获取参数,将选定修改为1.
int sum=FIN*(2^7)+SYN*(2^6)....;//累加

sql语句:
SELECT * FROM table WHERE TOS=sum

goosman 2009-11-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lianda220 的回复:]
Java codeSELECT* FROM table WHERE bitand(to_char(TOS),'26')!=0;

谢谢,谢谢哥们    我想我的描述你基本上理解了    是oracle的话  你的方案是可以的,可我现在的项目用的是mysql,  请问mysql有bitand()函数吗?
[/Quote]

mysql那就更好用了.
&, |, ~, ^, <<, >>分别是与, 或, 非, 异或, 左移位, 右移位, 和普通编程语言中一样使用

由于有了移位操作的支持, 你甚至可以把全部放到数据库层面来实现了...当然, 这样对数据库依赖大点, 不过也貌似没有太好的解决方案, 只有你把上层接口做好咯..
lianda220 2009-11-29
  • 打赏
  • 举报
回复
SELECT * FROM table WHERE bitand(to_char(TOS), '26') != 0; 


谢谢,谢谢哥们 我想我的描述你基本上理解了 是oracle的话 你的方案是可以的,可我现在的项目用的是mysql, 请问mysql有bitand()函数吗?
goosman 2009-11-29
  • 打赏
  • 举报
回复
[Quote=引用楼主 lianda220 的回复:]
问题是这样的:
  IP地址封包的标头(header)的TOS是一个由8位二进制数组成    现在在数据库里有一个字段存储TOS(已整数形式存储的)
现在有一个需求    标志位| URG|ACK|PUSH|RST|SYN|FIN  其中FIN...都是复选框,根据选取的标志位去数据库中查找数据

其中标志位与TOS的关系是: 1  2  3    4    5  6  7  8(TOS位数)
                        |  |  |    |    |  |
                        URG ACK PUSH RST  SYN FIN 

请高人给个思路,谢谢...
[/Quote]

假设要查询ACK, PUSH, SYN是1的. 假设他们对应的是从右向左第5, 4, 2位, 那么值就是.
00011010, 这一步在程序中做移位相加.
比如:
int ack = 1 << (5 - 1);
int push = 1 << (4 - 1);
int syn = 1 << (2 - 1);
int tmp = ack + push + syn;
那么值是26
假设数据库是oracle...其他数据库可以网上查下对应的位运算符.
下面的处理使用了外部移位的方式.
SELECT * FROM table WHERE bitand(to_char(TOS), '26') != 0;

我们的00011010中是0的那些位会直接取得0, 是1的那些位会取得TOS对应位上的值. 这样, 如果全0, 就说明ack, push, syn都是0的, 所以, 判断ack, push, syn中至少有一个是数据库中为真, 可以用上面语句.

至于, 你具体怎么做, 自己构思一下, 因为你需求描述的不是很清楚...我也不好多说, 这个你结合程序和数据库两方面来做位运算我认为是最好的处理方法.
java_running 2009-11-29
  • 打赏
  • 举报
回复
up
panhaichun 2009-11-27
  • 打赏
  • 举报
回复
复选框选中的置1,没有选中的置0,合并成8位二进制,然后转换成整数,与数据库中TOS相等即符合查询
whereusejava 2009-11-27
  • 打赏
  • 举报
回复
在页面用单选框,判断哪个被选中了。。。
用的是什么技术。。。。。

50,559

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧