我正在尝试正确使用编组工具将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#中的这种情况。
这是怎么回事?