-1

クラスがあります

class DataqFmt 
{
public:
    unsigned short  SR_number;
    unsigned short  SR_numerator;
    unsigned char   offset;
    unsigned char   nbytes;
    short       hdr_bytes;
    unsigned long   dat_bytes;
        char        dummy[1144];
};

コード c++ :

afl = fopen(path, "rb");
DataqFmt dataqstr;
fread ((char*) &dataqstr, sizeof (dataqstr), 1, afl);

このコード c++ を c# に変換するにはどうすればよいですか。私を助けてください

4

3 に答える 3

1

このファイルを書き込んだ C++ アプリケーションは、Win32 x86 用にコンパイルされ、Win32 x86 上で実行されると仮定します。DataqFmtこれにより、配置された方法について推測することができます。これらの仮定が間違っている場合は、 や などの および関連する属性のさまざまなオプションを使用して調整できStructLayoutます。MarshalAsFieldOffset

まず、 と同じレイアウトの C# 構造体を使用しますDataqFmt

[StructLayout(LayoutKind.Sequential)]
struct DataqFmtCs
{
    public ushort SR_number; // assuming the C++ type unsigned short is 2 bytes
    public ushort SR_numerator;
    public byte offset; // assuming the C++ type unsigned char was an unsigned and 1 byte
    public byte nbytes;
    public short hdr_bytes; // assuming the C++ type short was 2 bytes
    public uint dat_bytes; // assuming the C++ type unsigned long was 4 bytes
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1144)]
    public sbyte[] dummy; // assuming the C++ type char was signed and 1 byte
}

その構造では、生のバイトを取得するためにファイル I/O を実行する必要があります。

int dataqfmtSize = Marshal.SizeOf(typeof(DataqFmtCs));
var buffer = new byte[dataqfmtSize];
using (var fs = File.OpenRead("path\\to\\the\\file")) {
    int bytesRead = fs.Read(buffer, 0, buffer.Length);
    if (bytesRead != buffer.Length) {
        // handle this
    }

    DataqFmtCs someThing = GetDataqFmtFromBuffer(buffer);
}

最後に、変換ルーチンがありGetDataqFmtFromBufferます。

private static DataqFmtCs GetDataqFmtFromBuffer(byte[] buffer) {
    GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
    try {
        return (DataFmtCs)Marshal.PtrToStructure(
            handle.AddrOfPinnedObject(),
            typeof(DataFmtCs));
    } finally {
        handle.Free();
    }
}

Marshal.PtrToStrucutre変換作業の大部分を行っています。コードの残りの部分は、構造体を定義し、基本的な .NET ファイル I/O を実行するだけです。

もう 1 つのオプション (エンディアン変換を実行する必要があることが多いため、プラットフォームに依存しない十分に文書化されたプロトコルを使用している場合、これは多くの場合良い解決策です) はStreamBinaryReader. これは演習として残しておきます。

于 2013-11-25T06:52:59.603 に答える
0

Visual Studio を使用している場合は、C++ コードをインポートして CLR ライブラリにコンパイルし、他の .net アセンブリから参照することもできます。これは、C++ コードを高速に実行する必要がある場合に特に有効です。

于 2013-11-27T18:57:53.357 に答える