История изменений
Исправление alysnix, (текущая версия) :
Цикл на несколько строчек с объявлением временных переменных и замусориванием контекста, и один-единственный вызов функции высшего порядка.
fn qspCRC(data: &[u8]) -> i32 {
data.iter().fold(0, |crc, b| {
let tbl = qspCRCTable[((crc & 0xFF) as u8 ^ b) as usize];
(tbl as i32^crc>>8) ^ 0xD202EF8Du32 as i32
})
}
эквивалентный(почти) код на си
int qspCRC(uint8* ptr, uint len) {
int crc = 0;
while (len--)
crc = (qspCRCTable[(crc & 0xFF) ^ *ptr++] ^ crc >> 8)
^ 0xD202EF8D;
return crc;
}
а теперь вопрос - где больше промежуточных переменных? в сишном коде это лишь crc. в растовом еще две переменных.
растовый код принимал сразу косорукую «ссылку на массив» &[u8], что не есть эквивалент void* - это есть «указатель на что угодно», отчего требовался еще один поинтер внутри сишной функции.
также в растовом коде длина не передается, а в сишном она есть.
То есть растовый код не есть эквивалент сишному от автора. как в растовом передается длина массива - непонятно. видиомо она записана в самом массиве. но это уже по другому организованные данные.
Передавайте в растовую функцию нетипизированный адрес и длину, тогда имеет смысл сравнивать.
Исходная версия alysnix, :
Цикл на несколько строчек с объявлением временных переменных и замусориванием контекста, и один-единственный вызов функции высшего порядка.
fn qspCRC(data: &[u8]) -> i32 {
data.iter().fold(0, |crc, b| {
let tbl = qspCRCTable[((crc & 0xFF) as u8 ^ b) as usize];
(tbl as i32^crc>>8) ^ 0xD202EF8Du32 as i32
})
}
эквивалентный(почти) код на си
int qspCRC(uint8* ptr, uint flen) {
int crc = 0;
while (len--)
crc = (qspCRCTable[(crc & 0xFF) ^ *ptr++] ^ crc >> 8)
^ 0xD202EF8D;
return crc;
}
а теперь вопрос - где больше промежуточных переменных? в сишном коде это лишь crc. в растовом еще две переменных.
растовый код принимал сразу косорукую «ссылку на массив» &[u8], что не есть эквивалент void* - это есть «указатель на что угодно», отчего требовался еще один поинтер внутри сишной функции.
также в растовом коде длина не передается, а в сишном она есть.
То есть растовый код не есть эквивалент сишному от автора. как в растовом передается длина массива - непонятно. видиомо она записана в самом массиве. но это уже по другому организованные данные.
Передавайте в растовую функцию нетипизированный адрес и длину, тогда имеет смысл сравнивать.