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
- 1. IPv6 주소 대체 gethostbyname
- 2. 내가 IPv6 주소 문자열을
- 3. 도메인 이름에 대한 IPv6 주소
- 4. 유효한 IPv6 주소, 74DC :: 02BA입니까?
- 5. 모든 인터페이스에서 모든 IPv6 주소 얻기 (Windows)
- 6. IPv6 로컬 인터페이스 및 링크 로컬 주소
- 7. Perl IPv6 주소 확장/구문 분석
- 8. 어댑터의 기본 IPv6 소스 주소 확인
- 9. getaddrinfo()는 IPV6 주소 인 :: 1만을 반환합니다.
- 10. 비교 주소 :: endl의
- 11. IP 주소 비교
- 12. WinDbg의 두 개체 주소 비교
- 13. ipv6 이전의 부작용
- 14. InetAddress.getHostAddress() ipv6 compliant?
- 15. .NET Regex : Howto IPv6 주소 부분을 추출하는 방법
- 16. C/C을 찾고 ++ 언어와 표준 라이브러리 사양
- 17. IPv6 샘플 데이터?
- 18. IPv6 넷 마스크 접두사 확인
- 19. 모범 사례 IP 주소 저장 및 비교
- 20. 어떤 종류의 메모리 주소 비교/비교를위한 타입
- 21. 한다 getaddrinfo 및 IPv6
- 22. Jetty에서 IPv6 주소로 바인딩
- 23. IPv6 문자열을 바이트 + 파이썬으로 변환
- 24. Gethostname 및 IPv6
- 25. WCF IPv6 끝점
- 26. IPv6 및 SoapTcpTransport.GetInputChannel (WSE)
- 27. SNMP 트랩이 IPv6 주소로
- 28. IPv6 영역 색인 및 scope_id
- 29. LWP에서 IPv6 지원을 활성화하려면 어떻게합니까?
- 30. 자바를 사용하는 사용자의 IP 주소
또는'operator =='가 이미있는'boost :: array'. –
dalle