0
我有許多(百萬)IP4和IP6地址的文本文件。我需要儘快閱讀所有內容。從文件中讀取IP地址的最有效方法
我知道inet_pton
,但我不知道地址是IP4還是IP6,所以我需要做「嘗試和錯誤」的方法,我嘗試IP4,如果失敗,請嘗試IP6。但是我不喜歡這個解決方案,因爲當IP6是IP4時,我會不必要地解析IP4。
我有許多(百萬)IP4和IP6地址的文本文件。我需要儘快閱讀所有內容。從文件中讀取IP地址的最有效方法
我知道inet_pton
,但我不知道地址是IP4還是IP6,所以我需要做「嘗試和錯誤」的方法,我嘗試IP4,如果失敗,請嘗試IP6。但是我不喜歡這個解決方案,因爲當IP6是IP4時,我會不必要地解析IP4。
我認爲,所有你需要做的是從當前行解析字符,直到你打任何非十進制數字(因爲IPv6使用十六進制,而IPv4的一般不會,如果我們可以假設點分十進制)或冒號。
如果你點擊一個點,而你知道該線路是IPv4地址,否則它是IPv6。
最多四個字節的額外解析應該是確實是快。
這裏是在執行這一分類功能的嘗試:
int get_af(const char *address)
{
while(isdigit((unsigned int) *address))
++address;
if(*address == '.')
return AF_INET;
if(*address == ':' || isxdigit((unsigned int) *address))
return AF_INET6;
return -1;
}
以上假設既不AF_INET
也不AF_INET6
爲-1,因爲這是用於錯誤的報告。這可能需要調整。
它是一個文本文件嗎?如果該文件不包含類型信息,那麼您還能如何做到這一點?如果沒有至少查看一些*數據以確定它是否符合標準,您就不會奇蹟般地知道該類型。 – unwind 2013-04-10 09:29:19
@unwind文本文件。最好的辦法是有一些智能功能,可以有效地嘗試解析並返回一個適合的函數。 C#確實有一個。 – Euphoric 2013-04-10 09:31:39
而C#的功能可能在內部執行相同的「試錯法」。 – interjay 2013-04-10 09:34:43