数据库里有一列 ip, 存储内容是经过转换的ip, 比如
192.168.1.1, 数据库里存的是 192* 256^3 + 168* 256^2 + 1* 256^1 + 1* 256^0
如果想去数据库查询 192.168.1.* 的话,
192.168.1.0 === 192* 256^3 + 168* 256^2 + 1* 256^1 + 0* 256^0 === MIN
192.168.1.254 === 192* 256^3 + 168* 256^2 + 1* 256^1 + 254* 256^0 === MAX
可以用这个sql条件语句:
.... where ip >= MIN and ip <= MAX
但如果用 192.*.1.* 这样来查的话,就不能用简单的 >= <= 了, 请教有啥好办法?
谢谢。
192.168.1.1, 数据库里存的是 192* 256^3 + 168* 256^2 + 1* 256^1 + 1* 256^0
如果想去数据库查询 192.168.1.* 的话,
192.168.1.0 === 192* 256^3 + 168* 256^2 + 1* 256^1 + 0* 256^0 === MIN
192.168.1.254 === 192* 256^3 + 168* 256^2 + 1* 256^1 + 254* 256^0 === MAX
可以用这个sql条件语句:
.... where ip >= MIN and ip <= MAX
但如果用 192.*.1.* 这样来查的话,就不能用简单的 >= <= 了, 请教有啥好办法?
谢谢。
解决方案 »
- vc ODBC 读取excel中的数据后传送不到我的数组中去了
- 如何将一个对话框类,添加到视图类中,成为视图类的成员变量
- getpeername 返回的 IP 总是 204.204.204.204
- 求助:VS6的sp5安装不成功
- !!如何才能减少DirectShow在运行时的线程数量?
- 无论CreateFont(...)里的参数怎么改,字体总是放不大,怎么回事?●
- 俺是搞java的 ,现在需要用到一点dll的东西,还望各位帮忙
- 关于MDI的几个问题
- 请教:如何查询TCP套接字是否已被断开?如何在程序里建立session ?
- 用CPicture::Load(UINT nIDRes)载入资源图像的问题
- VC中关于字符串免杀问题求助?
- 请教关于TIME_WAIT的问题
这个和你的存储形式有关,别的不用考虑,XXX.XXX.XXX.XXX的IP地址本身不重复全表示就需要四个字节,而这种压缩存储形式最大占用2字节。可能有别的好办法,一时未想出来。
2个字节只能表示65536个数,你觉得这可能表示了全部的IP吗?xxx.xxx.xxx.xxx这种四个字节表示法有压缩的可能性吗?
LZ提到的存储方法和in_addr有啥关系?
typedef struct in_addr {
union {
struct {
u_char s_b1,s_b2,s_b3,s_b4;
} S_un_b;
struct {
u_short s_w1,s_w2;
} S_un_w;
u_long S_addr;
} S_un;
} in_addr;
192* 256^3 + 168* 256^2 + 2* 256^1 + 1* 256^0 我们反过来看更便于理解:1 * 256^0 + 2 * 256^1 + 168 * 256^2 + 192 * 256^3第一个加号前面的就不说了第二个加号前面的:
2 * 256^1 = 1 * 2^8 = 1 << 8
同理
168 * 256^2 = 168 * 2^16 = 168 << 16
192 * 256^3 = 192 * 2^24 = 192 << 24
最后加起来的效果就是
1放在整数的第一个字节
2放在整数的第二个字节
168放在整数的第三个字节
192放在整数的第四个字节
总之,一个四个字节整数可以表示这个ip,其中每个字节放了ip四个段中的一段。这种存储方式不是和in_addr的存储方式一样吗?只不过字节序有差别而已,楼主用的是主机字节序,而in_addr用的是网络字节序
乘的优先级比异或高
192* 256^3 + 168* 256^2 + 1* 256^1 + 1* 256^0
=(192 << 8)^3 + ...
我压根就没想到乘方,呵呵
怕啥,讨论越说越清楚,所以我奇怪LZ的那个压缩方式如何还原,或者LZ忘了括号?