我有一个函数可以根据任何数据包的内容生成 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];