我试图正确地使用封送处理将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中的这个条件。
这里发生了什么事?