C文字配列のマーシャリングに問題があります。私は次のC#構造を持っています:
[StructLayout(LayoutKind.Explicit, Size = 16, CharSet = CharSet.Ansi), Serializable]
internal struct Header
{
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 4)]
[FieldOffset(0)]
public string header;
[FieldOffset(4)]
public int version;
[FieldOffset(8)]
public int diroffset;
[FieldOffset(12)]
public int direntries;
}
ストリームからこの構造を読み取るための次のコード:
public static T ReadStruct<T>(this Stream stream) where T : struct
{
var sz = Marshal.SizeOf(typeof(T));
var buffer = new byte[sz];
stream.Read(buffer, 0, sz);
var pinnedBuffer = GCHandle.Alloc(buffer, GCHandleType.Pinned);
var structure = (T) Marshal.PtrToStructure(
pinnedBuffer.AddrOfPinnedObject(), typeof(T));
pinnedBuffer.Free();
return structure;
}
今私の問題はheader
、構造体が読み取られた後、フィールドが文字を見逃していることです。構造体が読み取られるファイルには4バイトが含まれていますが、構造体がヘッダー文字列VPVP
によって読み取られた後は、のみが含まれます。デバッガーの読み取り関数のバイト配列を見ると、その配列には値86、80、86、80が含まれています。これはです。私も使ってみましたが、何も変わりませんでした。ReadStruct
VPV
VPVP
LayoutKind.Sequential
StructLayout
何か間違ったことをしているのですか、それとも文字列に文字がないのですか?