Я действительно устарел, когда он идет с C, и мне нужно понимать код, сделанный другим разработчиком, основанный на CRC32. У меня есть массив ulong
static const ulong crc32_table[256] =
{
0x00000000ul, 0x04c11db7ul, 0x09823b6eul, 0x0d4326d9ul,
0x130476dcul, 0x17c56b6bul, 0x1a864db2ul, 0x1e475005ul,
0x2608edb8ul, 0x22c9f00ful, 0x2f8ad6d6ul, 0x2b4bcb61ul,
0x350c9b64ul, 0x31cd86d3ul, 0x3c8ea00aul, 0x384fbdbdul,
...
};
Затем этот массив используется для шифрования данных следующим образом:
void CRC32(const byte *buf, uint len, const byte init[4], byte crc[4]) {
memcpy(crc, init, 4);
while (len--) {
const byte * tmp = (const byte *)(crc32_table + (crc[3] ^ *buf));
crc[3] = crc[2] ^ tmp[3];
crc[2] = crc[1] ^ tmp[2];
crc[1] = crc[0] ^ tmp[1];
crc[0] = tmp[0];
++buf;
}
}
Чего я не понимаю, так это строки:
const byte * tmp = (const byte *)(crc32_table + (crc[3] ^ *buf));
Кажется, что весь массив используется дополнительно и приводится к байтам (на самом деле uint), но я не привык к такого рода операциям.
Кто-нибудь может мне помочь?
Мне нужно написать эквивалент функции CRC32, но на C # Сработает ли это:
uint[] crc = sharedkey;
uint[] buff = new uint[] { 0x4fu, 0xaeu, 0x07u, 0x0bu, 0x68u, 0x56u, 0x34u, 0x12u };
for(int i=0; i < len; i++)
{
byte[] tmp = BitConverter.GetBytes(crc32_table[(int)(crc[3] ^ buff[i])]);
crc[3] = crc[2] ^ tmp[3];
crc[2] = crc[1] ^ tmp[2];
crc[1] = crc[0] ^ tmp[1];
crc[0] = tmp[0];
}
ulong, uint
не являются стандартными типами. Выложите, пожалуйста, их определения. - person chux - Reinstate Monica   schedule 23.02.2021const byte *buf
) и CRC (например:byte crc[4]
), вы можете определить, было ли изменено исходное сообщение, пересчитав CRC. - person h0r53   schedule 23.02.20210x04c11db7
совпадает с одной из обычных 32-битных CRC. - person ilkkachu   schedule 23.02.2021