2012-07-10 47 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中这是不可用的,所以你必须把它拼出来。