0

我有一个 C# 服务器需要CRC (CRC16 – CCITT (xModem))从一个字节数组中计算一个。问题是我想从 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# 服务器上的代码?
  • 这种方法(创建 C++ 代码来计算 CRC)是否具有更好的性能?
4

1 回答 1

2

CLR 中的 Just In Time 编译器非常好。我认为您不会看到使用 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 回答