代码之家  ›  专栏  ›  技术社区  ›  Samuel

马歇尔:sizeconst必须实际是+1?(带复印件)

  •  0
  • Samuel  · 技术社区  · 6 年前

    我试图正确地使用封送处理将4个字节序列化为一个字符串。 当阅读关于 SizeConst ,它指出

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

    所以我假设要读取4个字节作为字符串,我需要以下结构来进行封送处理

        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 回复  |  直到 6 年前