2014-03-28 57 views
1

我有一個字節數組,從映像文件中讀取,我試圖從C#跨套接字發送到運行collectionFS(v0.3.7)的Meteor服務器。從字節數組創建正確轉義的字符串

我試圖將其轉換爲一個字符串,結果我就從在JavaScript調用FileReader.readAsBinaryString()得到匹配,例如:

?PNG\r\n\u001a\n\u0000\u0000\u0000\rIHDR\u0000\u0000\u0003?\u0000\u0000\u0002? 

在我的C#代碼,我一直在使用System.Text.Encoding.UTF8.GetString()試過了,這給了我像這樣:

�PNG\r\n\n\0\0\0\rIHDR\0\0�\0\0 

這在傳輸上失敗,大概是因爲'\ 0'被視爲像字符串的結尾。

任何人都可以更好地解釋這裏發生了什麼?在C#中使用像readAsBinaryString()這樣的unicode轉義序列來格式化字節是否有一個好方法?

編輯:這個數據的最終目的地是MongoDB(流星)中的BSON二進制條目,稍後將被提取(作爲Blob)並通過普通的Meteor Web瀏覽器客戶端進行查看。

+0

只會編碼的每一個字節爲十六進制的工作(要容易得多,大量重複的)? –

+0

我可以嘗試,雖然我懷疑它需要unicode出於某種原因轉義。我會更新這個問題,但是這個數據的最終目的地是MongoDB中的BSON二進制條目。 – WildCrustacean

回答

1

沒有內置的方法可以做到這一點。

要將字節數組轉換爲編碼,您需要確定什麼是編碼,哪些不是。貌似0-9a-zA-Z範圍不應該被編碼,其餘編碼爲\uXXXX

我這樣做如下:

var result = String.Join("", byteArray 
    .Select(b => b >'0' && b <'9' ? 
     (char)b.ToString() : String.Format(@"\u{0:x4}", b))); 
+0

有趣的是,這主要起作用,但我不得不將它改成'((char)b.ToString())'。我不明白這種編碼,它似乎是一些奇怪的混合系統。雖然謝謝! – WildCrustacean

+0

@WildCrustacean - 內嵌你的代碼修復 - 謝謝。如果您決定不應轉換超過0-9個字符,請考慮將「不轉換字節」的檢查轉換爲「HashSet.Contains」。 –