私は次の構造を持っています
[StructLayout(LayoutKind.Sequential)]
public struct SFHeader
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
public string FileName;
public int Offset;
public short Size;
public byte Flags;
public byte Source;
public long LastWriteTime;
public byte[] GetBytes()
{
int size = Marshal.SizeOf(this);
var buffer = new byte[size];
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(this, ptr, true);
Marshal.Copy(ptr, buffer, 0, size);
Marshal.FreeHGlobal(ptr);
return buffer;
}
public static SFHeader FromBytes(byte[] buffer)
{
var str = new SFHeader();
int size = Marshal.SizeOf(str);
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(buffer, 0, ptr, size);
str = (SFHeader)Marshal.PtrToStructure(ptr, str.GetType());
Marshal.FreeHGlobal(ptr);
return str;
}
}
構造体をバイト配列に変換する必要があるため (ソケットでパケットとして送信するため)、GetBytes
メソッドを使用しますが、バイト配列で24
はなくバイト配列を返し21
ます。
- ファイル名 (文字列): 5 バイト
- オフセット (整数): 4 バイト
- サイズ (短): 2 バイト
- フラグ (バイト): 1 バイト
- ソース (バイト): 1 バイト
- LastWriteTime (ロング): 8 バイト
したがって、5+4+2+1+1+8 = 21 バイトです。
これMarshal.SizeOf
は 24 を返すために発生します。なぜですか? そして、余分なバイトは文字列のバイトの後に配置されているようです。実際には、たとえば次の構造です。
var header = new SFHeader()
{
FileName = "aaaa",
Offset = 1,
Size = 1
};
次のバッファに変換されます。
[0] = 97
[1] = 97
[2] = 97
[3] = 97
[4] = 0
[5] = 0
[6] = 0
[7] = 0
[8] = 1
[9] = 0
[10] = 0
[11] = 0
[12] = 1
[13] = 0
... The following are all zero (0)
5 番目、6 番目、7 番目は超過バイトです。どうすればこの問題を解決できますか?