Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何存储长度前缀字符串_C#_String_Memory_Pointers_Struct - Fatal编程技术网

C# 如何存储长度前缀字符串

C# 如何存储长度前缀字符串,c#,string,memory,pointers,struct,C#,String,Memory,Pointers,Struct,我有一个程序,接收二进制序列化的网络数据包。我目前有一种方法,通过使用指针将数据直接从字节数组存储到结构中。但我现在需要的是一种在结构中存储UTF字符串的方法,同时仍然保持从字节数组复制的简单方法。假定字符串的前缀为无符号短字符,表示字符串的字节长度。这是C#在内部存储char[]或字符串的方式,还是我需要创建自己的结构来存储它 我当前的结构布局如下所示: public struct GenericPacket { public short packetid; public s

我有一个程序,接收二进制序列化的网络数据包。我目前有一种方法,通过使用指针将数据直接从字节数组存储到结构中。但我现在需要的是一种在结构中存储UTF字符串的方法,同时仍然保持从字节数组复制的简单方法。假定字符串的前缀为无符号短字符,表示字符串的字节长度。这是C#在内部存储char[]或字符串的方式,还是我需要创建自己的结构来存储它

我当前的结构布局如下所示:

public struct GenericPacket
{
    public short packetid;

    public static GenericPacket ReadUsingPointer(byte[] data)
    {
        unsafe
        {
            fixed (byte* packet = &data[0])
            {
                return *(GenericPacket*)packet;
            }
        }
    }
}
使用指针读取只是获取一个字节数组并返回一个指向它的指针,但作为泛型结构。这适用于所有普通类型,但字符串更复杂


谢谢你的建议

这是一个BSTR,BSTR方法将对其起作用(在Win32和Win32兼容库中提供)-如果前缀指的是字节,而不是字符计数,因为字符可以是多个字节;BSTR对此一无所知


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

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

您可以像这样从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中这是不可用的,因此您必须将其详细说明。

我知道,但我正在将字节数组直接映射到内存位置,并想知道如何使用字符串来实现它。因此,前缀以字节为单位。。。那是不是意味着不?!