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。这适用于所有普通类型,但字符串更复杂。

感谢您的任何想法!

4

3 回答 3

0

那是一个 BSTR 和 BSTR 方法将适用于它(在 Win32 和 Win32 兼容性库中可用) - 如果您的前缀指的是字节,而不是字符数,因为字符可以是多个字节;BSTR 对此一无所知。

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

于 2012-07-10T06:18:04.163 回答
0

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

于 2012-07-10T06:19:19.547 回答
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 中这是不可用的,因此您必须将其拼写出来。

于 2012-07-10T06:20:42.833 回答