1

構造体をバイナリ ファイルに書き込もうとしましたが、正しく読み取ることができません。

これは私の構造体です。動的な数の「値」があります。値の数が 3 の場合、GetSize() は 8 + (8*3) = 32 を返します。

[StructLayout (LayoutKind.Sequential)]
public struct Sample
{
    public long timestamp;
    public double[] values;

    public int GetSize()
    {
        return sizeof(long) + sizeof(double) * values.Length;
    }
}

まず、次の方法で構造体をバイトに変換します。

public static byte[] SampleToBytes(Sample samp)
{
    int size = samp.GetSize();
    byte[] arr = new byte[size];
    IntPtr ptr = Marshal.AllocHGlobal(size);
    Marshal.StructureToPtr(samp, ptr, true);
    Marshal.Copy(ptr, arr, 0, size);
    Marshal.FreeHGlobal(ptr);

    return arr;
}

次に、BinaryWriter を使用してバイトを書き込み、終了します。プログラムを再度実行して、保存したファイルを読み取る必要がある場合。BinaryReader を使用しています。ファイルから 32 バイトごとに取得し、次を使用して 32 バイトの各配列を構造体に変換します。

public static Sample BytesToSample(byte[] arr)
{
    Sample samp = new Sample();
    IntPtr ptr = Marshal.AllocHGlobal(32);
    Marshal.Copy(arr, 0, ptr, 32);
    samp = (Sample)Marshal.PtrToStructure(ptr, samp.GetType());
    Marshal.FreeHGlobal(ptr);

    return samp;
}

ただし、PtrToStructure() で SafeArrayTypeMismatchException が発生します。誰が私が間違っているのか教えてください。

ありがとう。

4

1 に答える 1

0

double[]は配列型であり、参照型であることに気付きましたか? long構造体は、ヒープ オブジェクトへの参照が続く を保持します。

それがうまくいかない理由だと思います。

配列の要素をバイナリライターに書き込むだけでよいと思います。

于 2013-07-19T23:41:01.370 に答える