2009-03-30 8 views
4

나는 IPv6를 함께 일하고 있어요 양식에 주소 :산술 (큰 정수)

FFFF : FFFF : FFFF : FFFF : FFFF : FFFF : FFFF : 내부적으로

FFFF, 내가 그들을 저장 배열 :

나는 등 사람이 할 수있는 좋은 방법을 제안 할 수 곱셈, 분할, 추가하는 등 다양한 방식으로 IPv6 주소를 조작해야
TIp6Bytes = array [0..15] of Byte; 

?

내가 내가 내가 추가 할 수 있다면, 당신은 다음, 빼기, 곱하기 및 추가를 사용하여 분할하는 데 사용할 수있는 말을 델파이 2009과

+0

내부적으로 2D 배열로 저장하지 않는 이유는 무엇입니까? IPv4 주소가 4x1 바이트로 조작 될 것처럼 8x2 바이트. –

+0

나는 Synapse에서 사용되는 것과 동일한 유형을 사용하고 있으므로 이미 제공되는 여러 기능을 사용할 수 있습니다. 왜 그들이 8x2로 그것을 저장하지 않는지 확실하지 않지만 그게 그 방법입니다 :) – norgepaul

답변

3

많은 제안을 시도한 후에 나는 내 모든 요구를 충족시키고 버그가없는 라이브러리를 찾을 수 없었습니다. 좀 더 세밀하게 조사한 Alex Ciobanu의 비교적 새로운 라이브러리 인 BigIntegers (및 Big Cardinals)는 일반 정수, 추기경 등을 조작 할 때와 동일한 방법으로 완벽하게 조작 할 수 있습니다.

BigIntegers , 라이브러리는 또한 매우 유용한 여러 기능을 제공합니다. readme에서 :

  • (List, Dictionary, HashSet 등) 집합입니다.
  • 날짜/시간 기능 은 "지원 클래스"기본의 세트를 정의
  • 형 지원 개념 (.NET의 날짜 시간 구조에 해당 어떻게 든 ) 몇 가지 구조의 모든 결합 각 내장 델파이 유형 (컬렉션에서 기본값으로 사용). 맞춤 "유형 지원"클래스는 유형으로 사용자 정의 데이터에 등록 할 수 있습니다.
  • BigCardinal 및 BigInteger 데이터 형식델파이

라이브러리

  • 스마트 포인터가 활발히 개발되고있다. 사실, 저자는 하루 안에 발견 한 작은 버그를 수정했습니다.

    Alex's 블로그에서 라이브러리에 대해 자세히 읽고 DeHL을 Google code에서 다운로드 할 수 있습니다.

  • 0

    을 일하고 언급해야 같아요. 오버플로가 단순히 무시되어야한다고 가정해야합니까?

    XOR을 사용하여 비트 지향 변수를 추가하는 방법을 생각해보십시오. 나는 그 대답을 지금 찾고있다.

    바라건대, 이것은 올바른 방향으로 여러분을 안내해 줄 수 있기를 바랍니다. 해당 XOR 코드를 찾을 수 있으면 게시 해 드리겠습니다.

    여기에 있습니다 : 비트 단위 연산 비트 단위 연산에 대해 독점적 분리가 자주 사용됩니다. 예 : 1 XOR 1 = 0 1 XOR = 1 1,110 0 XOR = 0,111 1,001

    (이 반송 않고 또한 상당하다)과 기준은 : http://www.absoluteastronomy.com/topics/Exclusive_disjunction

    4

    제스 KLINKE가의 bignum 부 쓴 파스칼 here.

    면책 조항 : 본인은이 라이브러리를 개인적으로 사용하지 않았습니다.

    +0

    와우 ... Int128, Int256 ... Int3k까지 모든 방법과 몇 가지 경우를 처리합니다. :) 아직 조각에 깊이 파고 들지는 않았지만 문제가 잘 해결 될 것 같은데요. (+1 할 수 있으면 좋겠다.) – skamradt

    +0

    이 라이브러리를 사용해 보았지만 빼기 함수에 큰 버그가있다. 저자에게 연락을 시도했지만 답변을받지 못했습니다. 다른 옵션에 대한이 질문에 대한 내 대답을 참조하십시오. – norgepaul

    3

    이전에 두 가지 유형의 IP 주소 모두에 대해 맞춤 변형 유형을 포함하여 IPv4 and IPv6 conversion unit을 작성했습니다. 예를 들어

    이러한 변형 유형, 다음 예제를 arithmetics과 전환이 가능합니다 :

    procedure TForm1.Log(const S: String); 
    begin 
        Memo.Lines.Add(S); 
    end; 
    
    procedure TForm1.Button1Click(Sender: TObject); 
    var 
        I4: TIPv4; 
        I6: TIPv6; 
        V1, V2, V3, V4: Variant; 
    begin 
        I4 := StrToIPv4('192.0.2.128'); 
        I6 := IPv4ToIPv6(I4); 
        V1 := VarIPv6Create('2001:db8:85a3:0:0:8a2e:0370:7334'); 
        V2 := IPv6ToVar(I6); 
        V3 := V1 - V2; 
        V4 := V1 or V2; 
        if V3 < V4 then 
        Log(V3 + ' is smaller than ' + V4); 
        if V2.Equals('::ffff:192.0.2.128') or V2.IsZero then 
        Log('OK'); 
        Log('V1 = ' + V1.AsStringOutwritten); 
        Log('V2 = ' + V2.AsURL); 
        Log('V3 = ' + V3.AsStringCompressed); 
        V4.Follow; 
    end; 
    

    사용자 정의 변형 유형은 정말 매우 강력하다.

    +0

    귀하의 IPv4 및 IPv6 변환 장치를 다운로드했으며, 무엇보다도 귀하의 작업을 축하해 주셔서 감사합니다. 이제 유닛에 실제로없는 것은 특정 IPv6 주소가 IPv6 서브넷의 범위 밖에 있는지 확인하는 기능입니다. IsInIPv6Subnet과 같은 것 ('2001 : db8 : 4000 :: ac45 :: 01ff', '2001 : db8 : 4000 ::/36'); 이러한 기능을 추가 할 계획이 있습니까? – FjodrSo