パケットの内容に基づいて CRC チェック バイトを生成する関数があります。問題は、関数を C++ から C# に変換することです。
C++ コード:
unsigned char GenerateCheckByte( char* packet, int length, unsigned long seed )
{
if( !packet ) return 0;
unsigned long checksum = 0xFFFFFFFF;
length &= 0x7FFF;
char* ptr = packet;
unsigned long moddedseed = seed << 8;
for( int i = 0; i < length; i++ )
checksum = ( checksum >> 8 ) ^ table[moddedseed + ( ( *(ptr++) ^ checksum ) & 0xFF )];
unsigned char result = ( (checksum>>24)&0xFF ) + ( (checksum>>8)&0xFF ) + ( (checksum>>16)&0xFF ) + ( checksum&0xFF );
return result;
}
char*(packet) は LPBYTE として定義することもできます。考え方は、*packet に割り当てられた値が *ptr に割り当てられ、ご覧のように *ptr が増加するということです。つまり、バイト配列が渡され、ポインタは次のバイトに移動します。
私はC#でそれをやろうとしましたが、何度も失敗しました.いくつかのハードワークの後、いくつかのコードを見つけましたが、実行できません:?
C# コード
public static unsafe byte GenerateCheckByte(byte *packet, int length, UInt32 seed )
{
if (*packet == 0)
return 0;
UInt32 checksum = 0xFFFFFFFF;
length &= 0x7FFF;
byte *ptr = packet;
UInt32 moddedseed = seed << 8;
for (int i = 0; i < length; i++)
checksum = ( checksum >> 8 ) ^ Table.table[moddedseed + ( ( *(ptr++) ^ checksum ) & 0xFF )];
byte result = (byte)(( (checksum>>24)&0xFF ) + ( (checksum>>8)&0xFF ) + ( (checksum>>16)&0xFF ) + ( checksum&0xFF ));
return result;
}
見た目は悪くないけど、そう呼べない
unsafe
{
packetBuffer[5] = Functions.GenerateCheckByte(&packetBuffer[0], 18, packet.seedCRC);
}
エラー: 「固定されたステートメント初期化子内の固定されていない式のアドレスのみを取得できます」
ご注意ください
C++ と C# の両方のアプリケーションの packetbuffer は byte[] packetBuffer = new byte[18]; です。