2011-07-13 70 views
4

我通過TCP套接字接收到一個字符串。這個字符串看起來像這樣:C#從IP地址字符串中刪除尾部' 0'

str = "10.100.200.200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; 

我應該如何解析這個IP地址?如果我這樣做,

IPAddress.TryParse(msg.nonTargetIP.Trim(), out ip); 

它無法解析。

什麼是最簡單的方法來刪除那些尾隨null?

+1

是否曾經有過在第一個'\'之前會有數據需要保留的情況? – MoarCodePlz

+2

尾部字符是反斜槓還是空字符? –

回答

13
IPAddress.TryParse(msg.nonTargetIp.Replace("\0", String.Empty).Trim(), out ip); 

或者讀了上Trim()你可以做的是可能會比較快的情況如下:

IPAddress.TryParse(msg.nonTargetIp.TrimEnd(new char[] { '\0' }), out ip); 
+0

工作完美!謝謝:-) – ceonikka

1

你可以嘗試的字符串替換,而不是微調的:

IPAddress.TryParse(msg.nonTargetIP.Replace("\0", ""), out ip); 
5

str = str.Replace("\0","");應該只是罰款。

4

裁剪方法相比,替換方法更有效。

msg.nonTargetIP.Trim(new [] { '\0' }); 
14

其他示例向您展示瞭如何修剪字符串 - 但最好不要讓「壞」數據開始。

猜測是,你有這樣的代碼:

// Bad code 
byte[] data = new byte[8192]; 
stream.Read(data, 0, data.Length); 
string text = Encoding.ASCII.GetString(data); 

這是無視Stream.Read返回值。你的代碼應該是這樣的,而不是:

// Better code 
byte[] data = new byte[8192]; 
int bytesRead = stream.Read(data, 0, data.Length); 
string text = Encoding.ASCII.GetString(data, 0, bytesRead); 

請注意,您應該檢查流是否已經關閉,而不要以爲你就可以在一個調用讀取所有數據Read,或者在另一端對Write的呼叫對應於對Read的一個呼叫。

當然,完全有可能根本不是這種情況 - 但是您應該真的檢查另一端是否嘗試在數據末尾發送這些額外的「空」字節。這聽起來不太可能。

+0

我已經在使用「更好的代碼」版本。但問題是我使用byte []數據並解析它。 – ceonikka

+0

@ceonikka:你在控制服務器嗎?這是垃圾數據的預期? –

+0

我是服務器,客戶端主要是Java/C++實現。 – ceonikka

1

可以只使用此TrimEnd():但你給的例子中包含非法IP地址,永遠不會成功解析無論

bool isIPAddress = IPAddress.TryParse(msg.nonTargetIP.nonTargetIP.TrimEnd('\0'), out ip); 

注(300> 255,每一個十進制數必須是在2到255的範圍內)。

0

即使你的意圖不是很清楚,如果你想要的是擺脫那些尾隨「\ 0」的那麼這行應該做的和你返回IPv4地址:

str = str.Substring(0,str.LastIndexOf('.')+4); 

希望它可以幫助!

+0

不,它不會。如果他的str =「10.100.200.2 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0」會怎樣?您將以10.100.200.2 \ 0 – Ian

+0

@ I oops結束......我沒有想到這種情況!謝謝你,指出這一點! – MrClan