如何存储长度前缀字符串

时间:2012-07-10 06:10:55

标签: c# string memory pointers struct

我有一个程序接收二进制序列化的网络数据包。我目前有一种方法可以通过使用指针将数据直接从字节数组存储到结构中。但我现在需要的是一种在结构中存储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。这适用于所有常规类型,但字符串更复杂。

感谢您的任何想法!

3 个答案:

答案 0 :(得分:0)

这是一个BSTR和BSTR方法可以使用它(在Win32和Win32兼容性库中可用) - 如果你的前缀是指字节,而不是字符数,因为字符可以是多个字节; BSTR不知道其中任何一个。

C-string以null结尾,没有前缀,C ++和C#字符串使用实现定义的存储,尽管它们通常使用具有单独长度参数的数组。他们绝对不是BSTR。

答案 1 :(得分:0)

您可以使用将返回字符串的System.Text.Encoding.GetString(byte [])或System.Text.Encoding.UTF8.GetString(byte [])

答案 2 :(得分:0)

您可以像char []这样构建一个字符串

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中,这是不可用的,所以你必须拼写出来。