|
分類:[C#]
C++(MFC)で書き出されたファイルにある構造体をC#側で読み込みたいと思い、
自分なりにやってみたところ、読み込みは出来るのですが8バイト程ずれて読み込んでしまっているようです。
恐らくC#側の構造体のうちどこかのデータ型が間違っていると思うのですが、見つけられません。
どこがおかしいか教えてください。
目的:C++で書き出された複数のEstimate構造体があるファイルを読み込みC#で利用する
現状:読み込み自体はできているが、8バイトずれて読み込まれてしまう。
環境:Visual Studio 2013 Update4
言語:C#、.NET Framework4.5
== C++側構造体定義 ==
struct Tails
{
int price;
int netprice;
int cost;
int costratio;
short ratio;
int k_tan;
int mbase;
int attr1;
int attr2;
int add;
int uke;
int ukekin;
};
struct Estimate
{
short dataflag;
short datacode;
short contents;
short line;
short bnumber;
short mstflag;
char name[30];
char shape[30];
char unit[6];
int number;
int tanka;
double kingaku;
char biko[16];
Tails Ztail;
Tails Rtail;
};
== C#側構造体定義 ==
[StructLayout(LayoutKind.Sequential)]
public struct Tails
{
public int price;
public int netprice;
public int cost;
public int costratio;
public short ratio;
public int k_tan;
public int mbase;
public int attr1;
public int attr2;
public int add;
public int uke;
public int ukekin;
}
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct Estimate
{
public short dataflag;
public short datacode;
public short contents;
public short line;
public short bnumber;
public short mstflag;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 30)]
public string name;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 30)]
public string shape;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
public string unit;
public int number;
public int tanka;
public double kingaku;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string biko;
public Tails Ztail;
public Tails Rtail;
}
== C#側読み込みの実装 ==
private void btn1_Click(object sender, RoutedEventArgs e)
{
using (FileStream fs = new FileStream(@"C:\Hoge\fuga.dat", FileMode.Open))
using (BinaryReader reader = new BinaryReader(fs))
{
int readCount = Marshal.SizeOf(typeof(Estimate));
//var buf = reader.ReadBytes(readCount);
byte[] buf = null;
do
{
buf = reader.ReadBytes(readCount);
var handle = GCHandle.Alloc(buf, GCHandleType.Pinned);
try
{
var obj = Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(Estimate));
}
finally
{
handle.Free();
}
} while (buf.Length == readCount);
}
}
|