MarshalAs:SizeConst实际上必须为+1吗? (带Repro保护套)

时间:2018-07-28 16:31:28

标签: c# marshalling

我正在尝试正确使用编组工具将4个字节序列化为字符串。 在阅读有关SizeConst的内容时,声明为

  

指示定长数组中的元素数或要导入的字符串中的字符数(不是字节)。

所以我假设要读取四个字节作为字符串,我需要以下结构进行编组

    struct Data
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
        public string string4;
    }

但是出于某种原因,我需要将SizeConst设置为5才能获得4个字节。

这是一些例子

    public void Test_Marshal()
    {
        var file = @"D:\foo.bin" ;
        var chars = new char[] {'W', 'H', 'A','T', '?'};

        File.WriteAllBytes(file, chars.ToList().Select( c => Convert.ToByte(c)).ToArray());


        var fileAsStream = new FileStream(file, FileMode.Open);

        int count = Marshal.SizeOf(typeof(Data));
        byte[] readBuffer = new byte[count];

        using (var reader = new BinaryReader(fileAsStream))
        {
            readBuffer = reader.ReadBytes(count);
        }

        GCHandle handle = GCHandle.Alloc(readBuffer, GCHandleType.Pinned);
        var aStruct = (Data)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(Data));
        handle.Free();

        System.Diagnostics.Debug.Assert(aStruct.string4 == "WHAT");
    }

我的工作:我写“什么?”以字节为单位的文件。 然后,我读取文件并将数据编组到一个结构中,该结构的成员设置为包含4的固定数组。 但是我只得到WHA,这是三个字符,我不明白为什么。如果是C / C ++,我会假设我需要一些空终止,但是我不知道C#中的这种情况。

这是怎么回事?

0 个答案:

没有答案