0
A
回答
1
48位= 6字节
你可以只是[0]
,[1]
访问数组的字节结构...
http://msdn.microsoft.com/de-de/library/windows/desktop/ms738560%28v=vs.85%29.aspx
比较,memcmp能有所帮助。
1
struct in6_addr {
unsigned char s6_addr[16]; /* IPv6 address */
};
char str[INET6_ADDRSTRLEN] //I assumed this has been filled up//
struct in6_addr addr1;
inet_pton(AF_INET6,&str, &addr1)
inet_pton将为我们填充上述结构。如果你只想要第6字节(48位),
unsigned char array[6];
for(int i=0;i<6;i++)
array[i] = addr1.s6_addr[i];
现在你可以绕过array
您的subnet.this的比较是如何提取的第6字节,我会做最好的功能,比较第一这个地址不需要每次都这样做,它会让你的工作更轻松。
这是来自unix网络编程的richard stevens。这是一个简单的函数来比较两个IP address.you可以直接通过sockaddr_xx
结构和功能将竭尽全力为您
#ifdef HAVE_SOCKADDR_DL_STRUCT
#include <net/if_dl.h>
#endif
int
sock_cmp_addr(const struct sockaddr *sa1, const struct sockaddr *sa2,
socklen_t salen)
{
if (sa1->sa_family != sa2->sa_family)
return(-1);
switch (sa1->sa_family) {
case AF_INET: {
return(memcmp(&((struct sockaddr_in *) sa1)->sin_addr,
&((struct sockaddr_in *) sa2)->sin_addr,
sizeof(struct in_addr)));
}
#ifdef IPV6
case AF_INET6: {
return(memcmp(&((struct sockaddr_in6 *) sa1)->sin6_addr,
&((struct sockaddr_in6 *) sa2)->sin6_addr,
sizeof(struct in6_addr)));
}
#endif
#ifdef AF_UNIX
case AF_UNIX: {
return(strcmp(((struct sockaddr_un *) sa1)->sun_path,
((struct sockaddr_un *) sa2)->sun_path));
}
#endif
#ifdef HAVE_SOCKADDR_DL_STRUCT
case AF_LINK: {
return(-1); /* no idea what to compare here ? */
}
#endif
}
return (-1);
}
,你可以修改这个方案对第一n
字节的子网工作,也它不是以字符串格式,但一些简单的修改会给你想要的结果。
1
正如@deviantfan建议的那样,您需要使用结构中存在的s6_addr
结构。
unsigned char r=0;
int i;
//assuming your addresses are in add1 and addr2 after `inet_pton`.
for(i=0; i<6;i++)
r = (addr1.sin6_addr.s6_addr[i]^addr2.sin6_addr.s6_addr[i]) | r ;
if(!r){
//Same first 48 bits
}
else{
//Not same
}
在这里,我关注下进行异或运算的6个字节的每个字节和所有的异或或运算在一起。只有当所有48位都相同时,最终结果才会变成zero
。
相关问题
- 1. Linux命令为IPV6 IP地址比较
- 2. 比较IPv4地址以IPv6表示法
- 3. 比较地址
- 4. 将IPv4或IPv6地址转换为长字来进行比较
- 5. 使用C++对ipv6地址进行比较操作
- 6. Java比较地址
- 7. 比较IP地址
- 8. 将对等方的IPv6地址与本地主机进行比较
- 9. 比较reference_wrappers的地址
- 10. IPv6地址(按主机名称)
- 11. 大数位按位比较
- 12. 代表IPv6地址
- 13. sockaddr和IPv6地址
- 14. IPv6地址范围
- 15. 解析IPv6地址
- 16. 比较内存地址
- 17. 比较IP v6地址
- 18. XPATH 1.0:比较IP地址
- 19. 如何比较IP地址
- 20. MongoDB比较I.P.地址
- 21. 在php比较ip地址
- 22. 比较两个地址列
- 23. SQL/PHP:比较地址
- 24. Python的IPv6字节地址
- 25. Linux IPV6主地址和副地址
- 26. 从PHP Ipv6 CIDR获取IPv6地址数
- 27. 如何比较两个ipv6地址在一个小端机在C
- 28. 在PHP中按位比较
- 29. iOS比较地理位置
- 30. IPv6地址到域名
可寻址内存的最小单位是一个字节。所以除非n是字节大小的倍数,否则不能提取n'位。 – ajay