如何编写C#CustomMarshaler以从字节数组中获取空终止的ANSI字符串?
我有很多需要解析为结构的二进制文件。我看到的最好和干净的方法是使用MarshalAs属性装饰结构并使用Marshal.PtrToStructure()。
但我遇到了一个问题。字符串的默认编组对我不起作用。
字节数组中的字符串以空值终止,每个字符一个字节(非指针而不是COM样式)。
public object MarshalNativeToManaged(IntPtr pointerNativeData)
{
List<byte> bytes = new List<byte>();
do
{
bytes.Add(Marshal.ReadByte(pointerNativeData, bytes.Count));
} while (bytes[bytes.Count - 1] != 0);
return Encoding.UTF8.GetString(bytes.ToArray());
}
}
我用这个方法来编组字节数组到struct:
int vectorSize = allMoves.size();
int r = rand() % vectorSize;
vector<Coordinate> finalList = allAiMoves[r]; // error here
int finalListSize = finalList.size();
int t = rand() % finalListSize;
这是我对字符串的自定义封送程序: public class AnsiNullTerminatedString:ICustomMarshaler { ...
foreign key(jmb)
references client.jmb
on update cascade
on delete restrict
但它很喜欢。
有没有办法为这种字符串编写正确的自定义编组器来解决这个问题而不使用手动编组或BinaryReader?