IPV6位址壓縮 C

2021-10-03 18:53:24 字數 2473 閱讀 7692

題目要求:給定一組ipv6位址(unsigned 0x),以文字形式輸出壓縮後的位址

一般要求

注:若有超過兩個地方有連續0,選擇較長的那個進行壓縮

輸入:1234:0abc:0000:0078:ff00:0000:0030:0005

2001:0db8:0000:0000:0001:0000:0000:0000

輸出:1234: abc:0:78:ff00:0:30:5

2001:db8:0:0:1::

具體函式:

unsigned

char v1=

;unsigned

char v2=

;unsigned

char v3=

;unsigned

char v4=

;unsigned

char v5=

;unsigned

char v6=

;

對於每乙個陣列呼叫一次轉換函式並將每次的結果存在乙個字元陣列中並輸出。

可分為兩步:

① 第一次掃瞄陣列,找出陣列中最多 0 的其實地方並記錄長度

② 第二次掃瞄陣列,一邊掃瞄一邊輸出

一、ipv6是8組十六進製制的數字那麼可以用

bool iszero =

false

;for

(int i=

0;i<

8;i++

)

來遍歷這個陣列(v是16位unsigned陣列)

同時還要記錄啟示下標和最大

bool iszero =

false

;int pos =0;

// referencing the start of longest 0s

int length =0;

//the longest 0s

int count =0;

//current count of 0s

for(

int i=

0;i<

8;i++)}

else

}

通過這一段**,length就記錄了最長0的位置,pos記錄了起始位置(八組數字中的第幾組開始是最長0)

二、轉成文字並壓縮

/*

tohex是乙個接收乙個unsigned,返回乙個char的函式

eg. unsigned a = 0xb;

char b = tohex(a);//b = 'b'

*/char

*a =

newchar[40

];// ipv6 address in text format is up to 40 chars, including '\0'

假設到了要壓縮的地方

i = pos = 0, length = 3(假設)

在這種情況下,就是

a[pos]

= a[pos+1]

=':'

;

並且原陣列中將會是 0000 0000 (兩個為一位,共4個數)1234 etc.

若工作指標是i,要跳過中間的0

假設迴圈如下

int h =0;

//h: 0 ~ 7指向第幾組

int k =0;

//填充到第k個字元

while

(h <7)

else}if

( h <

7&& h +

1!= pos)

a[k++]=

':';

h++;}

a[k]

='\0'

;

h是指向第幾組十六進製制數,每個h相當於包含了兩個v[i], 即兩位的hex,要將一組hex轉成四個字元需要:

共有兩個v[i]即v[2h] 和 v[2h+1],每個v[i]可能會轉成兩個char

考慮這幾種情況:

v[ 2h] = 0x00, v [2h+1] = 0x01 : 不輸出v[2h], 且跳過v[2h+1]前的0,即跳過v[2h+1] 轉成的兩個字元中的第乙個

v [2h] = 0x00, v [2h+1] = 0x00 : 不輸出v[2h], 跳過v[2h+1] 轉成的兩個字元中的第乙個,但是第二個0保留輸出

v [2h] = 0x01, v [2h+1] = 0x00 : 跳過v[2h]的第乙個字元(0), v[2h+1] (的0)保留輸出

v [2h] = 0x10, v [2h+1] = 0x00 : 原樣輸出v [2h], v [2*h+1] ,所有0都要保留

for

(int k =

0; k <

2; k++

)}

通過以上過程,將unsigned v[16] 儲存的16組而進駐數 轉化成了乙個存放在a中的字串

IPv6 位址格式

ipv6 位址大小為 128 位。首選的 ipv6 位址表示為 x x x x x x x x 其中每個 x 是代表乙個 4 位的十六進製制數字。ipv6 位址範圍從 0000 0000 0000 0000 0000 0000 0000 0000 至 ffff ffff ffff ffff ffff...

IPV6位址格式

一 單播位址 unicast ipv6addresses 1.可聚合的全球單播 aggregatable global unicast 即global位址,全球範圍內可達 2.鏈路本地位址 link local 用於同乙個鏈路上相鄰節點之間通訊。ipv6的路由器不會 鏈路本地位址的資料報。link ...

IPv6位址格式

ipv6 位址格式 ipv6 的位址長度是 128位 bit 將這128位的位址按每 16位劃分為乙個段,將每個段轉換成十六進製制數字,並用冒號隔開。例如 2000 0000 0000 0000 0001 2345 6789 abcd 這個位址很長,可以用兩種方法對這個位址進行壓縮,前導零壓縮法 將...