IPV6 주소는 16 바이트이며 C++에 저장하는 데 데이터 유형이 없기 때문에 IPV6 주소를 저장하고 IPv6 주소와의 비교를 원했습니다. 그것을하는 방법을 알고있다C++을 사용하는 ipv6 주소 비교 작업
답변
당신은 unsigned char
의 평범한 배열로 당신이 C에서 할 것 인 것처럼 그들을 저장할 수있다. 예를 들면를 좋아해라. 그런 다음 배열 비교 알고리즘을 사용하여 비교할 수 있습니다. char*
알고리즘을 사용하면 ipv6 주소의 일부 바이트가 0x00
일 수 있으므로 문자열 기반 알고리즘으로 문자열 끝 문자로 해석됩니다.
std :: strings로 저장하십시오. 그런 다음 문자열 비교 연산자를 사용할 수 있습니다. 이들 연산자는 적어도 등호/불평등 테스트와 관련하여 포함 된 Null 문자로 여겨지지 않습니다. 관계형 테스트 (<,> 등)의 경우 std :: string은 아마 원하는대로하지 않으므로 자신의 함수를 작성하고 싶을 것입니다.
또 다른 옵션은 ==! = [] 등의 연산자를 무시할 수있는 구조를 정의하는 것이며 내부에는 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 */}
};
개별 바이트에 액세스 할 수 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 }
};
, 나는 표준 목록에서 IP를 저장하고 한 가지 더는 단서 < 함수를 정의하는 방법을 내가 < ==이 functions.so 오버로드 된 연산자를 정의해야했다
주세요최근에는 비슷한 코드를 사용하여 유사한 질문을 처리해야했습니다.
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 배열이 항상 네트워크 바이트 순서로 저장되므로 먼저 호스트 바이트 순서로 변환해야합니다.
std::vector
에 IPV6 배열을 저장하십시오. STL 벡터에는 이미 연산자 <
과 ==
이 포함되어 있습니다.
boost :: array가 아마도 더 효율적입니다 (다른 주석 참조). – unixman83
또는'operator =='가 이미있는'boost :: array'. –
dalle