У меня есть функция, которая генерирует контрольный байт 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;
}
символ * (пакет) также может быть определен как LPBYTE, идея состоит в том, что значение, присвоенное * пакету, присваивается * 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 # равен byte [] packetBuffer = новый байт [18];