2013-09-29 140 views
1

我想發送一個十六進制字符串到TCP套接字。我對這個字符串的格式或轉換有一些問題,因爲我不太確定它使用的格式是什麼。C#發送十六進制字符串到TCP套接字

我寫了一個Windows Phone應用程序,它基於Socket類正常工作。 這個應用程序模擬請求,通常是從桌面程序發送到託管web服務的設備。

通過wireshark,我發現,web服務將接受輸入流(認爲它在十六進制),並返回第二。十六進制流包含我需要的數據。

所以桌面應用正在發送流 和Wireshark顯示了當:

數據(8個字節) 數據:62ff03fff00574600 長度:8

現在,我已經嘗試了很多重現此流。我想,它曾經是一個UTF8字符串,並將此流轉換爲此格式。但每次我發送它,在Wireshark中看到以下輸出:62c3bf03c3bf00574600

據我調查62 = b,但ff始終發送c3bf。

有人知道如何以正確的格式發送此流嗎?

乾杯, 喬

+0

您能否展示一些代碼表示法,說明您將如何發送數據以及如何獲取響應以及應該如何輸出數據? – Rezoan

+0

這裏的代碼與M $樣本幾乎完全相同。[鏈接](http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh202858(v = vs.105).aspx) – user2828101

+0

數據發送後,從十六進制轉換爲字符串過去是類似的東西字符串:bÿÿ所以,格式化工作。然後我做... result = client.Send(sendString); sendString是bÿÿ。該示例中的send方法然後從字符串到有效載荷的副本轉換,其中有效載荷是字節數組(byte [] payload = Encoding.UTF8.GetBytes(data))。這將通過套接字連接發送到設備。但是,問題是,當我在wireshark中解析數據時,這些0x00ff不會轉換爲ÿ,而是轉換爲c3bf。任何想法? – user2828101

回答

0

插座傳輸不應該關心,TCP數據包的內容是二進制表示「無所謂」。 從你指出,在評論代碼:

byte[] payload = Encoding.UTF8.GetBytes(data); 
socketEventArg.SetBuffer(payload, 0, payload.Length); 
... 
response = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred); 
response = response.Trim('\0'); 

在套接字發送結束/接收(數據==響應)。如果沒有發生這種情況,你需要確定問題出在哪裏。第一步是寫一些非常簡單的代碼如下所示:

string source = "your problem text string"; 
byte[] encode = Encoding.UTF8.GetBytes(source); 
target = Encoding.UTF8.GetString(encode, 0, encode.Length); 
Debug.Assert(source == target); 

如果這樣的作品,然後輸出「編碼」陣列可以檢查,以確保被包含在它正在發送的分組數據,然後驗證那是什麼被接收。如果你發送的是正確的數據但是收到的數據已經損壞,那麼你會遇到嚴重的問題......我懷疑你是否發現了這個問題,但是如果是這樣的話,可以編寫一個非常簡單的測試程序,在同一臺機器上發送和接收數據,看它是否可重複。

如果我不得不猜測,我會說,被編碼的字符不是Unicode或Win手機不能正確支持它(Proper unicode support)。

+0

非常感謝您的幫助。服務器不是問題。它很好地處理請求,但數據發送不正確。當我調試應用程序時,我可以看到,有效載荷獲取了它的數據數組,它保存着我正在等待的數據,但問題仍然存在,我曾用它發送62 ff 03 ff,但它使用'Encoding.Unicode.GetBytes發送0062 00ff 0003 00ff (數據)'。所以最後,服務器不理解請求,它的響應ERR1是絕對可以的。我的應用程序獲取此響應並顯示它。所以也行。 – user2828101

0

只要您不知道服務器期望的協議/編碼,您只能重播已知消息,如您在問題中提供的字節。

因此,你只需直接定義字節數組是這樣的:

byte[] payload = new byte[] {0x62, 0xff, 0x03, 0xff, 0xf0, 0x05, 0x74, 0x60}; 

,並把它在插槽像你之前與編碼字符串一樣。服務器現在應該接受消息,就像它是由您嗅探的客戶端發送的。

相關問題