0

CRC (CRC16 – CCITT (xModem))バイト配列からを計算する必要があるC#サーバーがあります。問題は、パフォーマンスを向上させるために、C#からC++コードを呼び出したいということです。しかし、提供されたC++アルゴリズムは明らかにVC++と互換性がないため、このタスクを実行するのに苦労しています。

CRC計算機能:

const UINT16 crc_table[16] = {
    0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
    0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef
};

UINT16 CalculateCrc( UINT8 *data, UINT32 len )
{
    UINT i;
    UINT16 crc = 0;

    while( len-- )
    {
        i = ( crc >> 12 ) ^ ( *data >> 4 );
        crc = crc_table[ i & 0x0F ] ^ ( crc << 4 );
        i = ( crc >> 12 ) ^ ( *data >> 0 );
        crc = crc_table[ i & 0x0F ] ^ ( crc << 4 );
        data++;
    }

    return ( crc & 0xFFFF );
}

ここ*dataで、はbyte []へのポインタでありlen、はこのbyte[]の長さです。

このコードをC#コードに「挿入」できるようにするために、を作成しましたC++ Class Libraryが、終了後に使用する方法がわかりません。

最後に、私の質問は次のとおりです。

  • 提供されたアルゴリズムを移植してVC++で動作させる方法は?
  • コンパイルされたクラスライブラリを使用して、C#サーバーで実際にコードを計算するにはどうすればよいですか?
  • このアプローチ(CRCを計算するためのC ++コードを作成する)は、パフォーマンスの面で優れていますか?
4

1 に答える 1

2

CLRのJustInTimeコンパイラはかなり優れています。C ++を使用しても、パフォーマンスが大幅に向上することはないと思います。実際、余分なオーバーヘッドがあるため、さらに遅くなる可能性があります。

アルゴリズムをCからC#に変換するのは非常に簡単です。データ型を同等のものに変更し、必要に応じてキャストを追加するだけです。

ushort[] crc_table = {
    0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
    0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef
};

ushort CalculateCrc( byte[] data )
{
    int i;
    ushort crc = 0;
    int len = data.Length;

    for (int j = 0; j < len; j++)
    {
        i = ( crc >> 12 ) ^ ( data[j] >> 4 );
        crc = (ushort) (crc_table[ i & 0x0F ] ^ ( crc << 4 ));
        i = ( crc >> 12 ) ^ ( data[j] >> 0 );
        crc = (ushort) (crc_table[ i & 0x0F ] ^ ( crc << 4 ));
    }

    return crc;
}

ただし、これはテストしていません。

于 2013-03-25T18:59:44.267 に答える