2009-12-30 5 views

답변

5

당신은 unsigned char의 평범한 배열로 당신이 C에서 할 것 인 것처럼 그들을 저장할 수있다. 예를 들면를 좋아해라. 그런 다음 배열 비교 알고리즘을 사용하여 비교할 수 있습니다. char* 알고리즘을 사용하면 ipv6 주소의 일부 바이트가 0x00 일 수 있으므로 문자열 기반 알고리즘으로 문자열 끝 문자로 해석됩니다.

+2

또는'operator =='가 이미있는'boost :: array '. – dalle

0

std :: strings로 저장하십시오. 그런 다음 문자열 비교 연산자를 사용할 수 있습니다. 이들 연산자는 적어도 등호/불평등 테스트와 관련하여 포함 된 Null 문자로 여겨지지 않습니다. 관계형 테스트 (<,> 등)의 경우 std :: string은 아마 원하는대로하지 않으므로 자신의 함수를 작성하고 싶을 것입니다.

1

또 다른 옵션은 ==! = [] 등의 연산자를 무시할 수있는 구조를 정의하는 것이며 내부에는 16 문자 또는 x int 배열로 구현 될 수 있습니다.이 배열은 건물 아키텍처에 따라 정의 할 수 있습니다. int의 크기를 모른다. 마스크 등을 가져 오는 작업도 정의 할 수 있습니다.이 방법을 사용하면 비트 연산자를 쉽게 사용할 수 있습니다.

편집 :

것은 당신이

std::list<MyIPStruct> iplist 

확인을 사용하고 있습니까?

당신이 목록을 반복하면 당신은

iplist[i] < iplist[i+1] 

을 비교할 수 있습니다 내가 당신의 질문을 이해하면 당신은> 연산자를 재정의하는 방법을 몰라?

struct MyIPStruct { 
    usigned char[16] bytes; // one option 
// unsigned int[16/sizeof(int)] bytes; // another option 

/* other methods... */ 

bool operator > (const MyIPStruct & ip2) { /* here is your code */} 
}; 
2

개별 바이트에 액세스 할 수 IPv6 주소 및 과부하 [] 연산자를 저장하는 바이트 배열의 래퍼 클래스를 생성하고 비교를 연산자를 오버로드 할 수 있습니다.

struct IPV6Address 
{ 
    unsigned char address[16]; 
    unsigned char operator [] (int i) ; // 
    bool operator == (const IPV6Address &ipv6) { //write you own logic } 
    bool operator < (const IPV6Address &ipv6) { //write you own logic } 
}; 
0
자신의 구조가 더 정의 comparisions에 대한

, 나는 표준 목록에서 IP를 저장하고 한 가지 더는 단서 < 함수를 정의하는 방법을 내가 < ==이 functions.so 오버로드 된 연산자를 정의해야했다

주세요
3

사용중인 플랫폼 또는 IP 스택을 지정하지 않았습니다. 윈도우에서 IPV6 주소는 구조체 호출 in6_addr에 저장됩니다. 해당 구조체에서 u_char Byte [16] 주소를가집니다. std :: memcmp()를 사용하면 두 구조를 비교할 수 있습니다.

리눅스에서 제안 된 표준은 또한 struckt in6_addr을 호출하며 위와 같은 방식으로 사용할 수 있습니다. 더 많은 정보 here.

0

최근에는 비슷한 코드를 사용하여 유사한 질문을 처리해야했습니다.

typedef union myip 
{ 
unsigned char ip8[16]; 
unsigned int ip32[4]; 
unsigned long long ip64[2]; 
}; 

그것 좀 황당하지만 잘 작동 : 멀리 이상적에서 내가 사용되는 기본 솔루션은 여러 가지 데이터 유형과 노동 조합을 만드는 것이 었습니다. 두 개의 IP를 비교하려면 64 비트 정수 유형 ip.ip64 [0] == ip에서 두 개의 비교가 필요합니다.ip64 [0] & & ip.ip64 [1] = ip.ip64 [1] 그런 다음 몇 가지 기본 기능/매크로를 추가하여 필요한 비교를 수행하십시오.

IPv6을 외부 구조에서 직접 복사하려면 ip8 구성원에 memcpy를 사용하거나 구조체를 포인터로 캐스트 할 수 있습니다. ip32는 때때로 IPv4 interop 조작 (IPv4 매핑 된 IPv6 주소)에 유용했습니다.

평등 이외의 다른 작업을 수행하는 경우 IPv6 배열이 항상 네트워크 바이트 순서로 저장되므로 먼저 호스트 바이트 순서로 변환해야합니다.

1

std::vector에 IPV6 배열을 저장하십시오. STL 벡터에는 이미 연산자 <==이 포함되어 있습니다.

+0

boost :: array가 아마도 더 효율적입니다 (다른 주석 참조). – unixman83