2012-07-10 48 views
0

我有一個程序接收二進制序列化的網絡數據包。我目前有一種方法,通過使用指針將數據直接從字節數組存儲到結構中。但我現在需要的是一種在結構中存儲UTF字符串的方法,同時仍然保持從字節數組複製的簡單方法。該字符串被假定爲帶有一個無符號短的前綴,表示該字符串的字節長度。這是如何C#內部存儲char []或字符串,或者我需要使我自己的結構來存儲它?如何存儲長度前綴字符串

我現在的結構佈局是這樣的:

public struct GenericPacket 
{ 
    public short packetid; 

    public static GenericPacket ReadUsingPointer(byte[] data) 
    { 
     unsafe 
     { 
      fixed (byte* packet = &data[0]) 
      { 
       return *(GenericPacket*)packet; 
      } 
     } 
    } 
} 

讀取使用指針只是需要一個字節數組,並返回一個指針,但作爲一個GenericStruct。這適用於每種正常類型,但字符串更復雜。

感謝您的任何想法!

回答

0

這是一個BSTR和BSTR方法可用於它(在Win32和Win32兼容性庫中可用) - 如果您的前綴引用的是字節,而不是字符計數,因爲字符可以是多個字節; BSTR不知道這些。

C字符串以空字符結尾,沒有前綴,C++和C#字符串使用實現定義的存儲,儘管它們通常使用帶有單獨長度參數的數組。他們絕對不是BSTR。

+0

所以,前綴是以字節爲單位......這是否意味着沒有?! – jduncanator 2012-07-10 06:35:50

0

可以使用System.Text.Encoding.GetString(字節[])或System.Text.Encoding.UTF8.GetString(字節[])將返回一個字符串

+0

我知道,但我直接將字節數組映射到內存位置,並想知道如何用字符串來做到這一點。 – jduncanator 2012-07-10 06:35:19

0

您可以構建從一個字符串char [] like this

char[] foo = new char[] {'a','b','c','d'} 
string bar = new string(foo); 

將此與範圍數組副本結合使用可從較大的字節塊中提取字符串。我相信這是什麼System.Text.Encoding.GetString(byte [] data,int start,int length)實際上是在內部執行的,但是在.NET Micro Framework中這是不可用的,所以你必須把它拼出來。