Как мне перевести мой код с C # на C ++ для функции CRC?

У меня есть следующий код в C # для расчета CRC, и он работает так, как я хочу.

 public byte crc_8(byte[] byteArray)
{
ushort reg_crc = 0;
for(int i = 0; i<byteArray.Length; i++)
{
reg_crc ^= byteArray[i];
for(int j = 0; j < 8; j++)
{
if((reg_crc & 0x01) == 1)
{
reg_crc = (ushort)((reg_crc >> 1) ^ 0xE5);
}
else
{
reg_crc = (ushort)(reg_crc >> 1);
}
}
}
reg_crc = (byte)(reg_crc & 0xFF);
return (byte)reg_crc;
}

Мне также нужно добавить эту же функцию в проект кода на C ++, но я новичок в C ++. Это насколько я понял, и я не уверен, что делать с кодом внутри цикла for. Также обратите внимание, что RX_PACKET_SIZE эквивалентно byteArray.Length в том, что он может быть использован для той же цели. Я знаю, что все в порядке.

static uint8_t crc_8(unit8_t array_to_process [])
{
uint16_t reg_crc = 0;
for(int i = 0; i < RX_PACKET_SIZE; i++)
{

}
}

-3

Решение

Массивы работают немного по-другому в C ++. Они не объекты; они в основном просто тип данных повторяется в памяти n раз. В вашем случае это было бы uint_8 повторный RX_PACKET_SIZE раз. Вы не передаете сам массив; вместо этого вы передаете указатель на первый элемент массива. Это версия вашего кода на C ++:

uint8_t crc_8(uint8_t* byteArray, size_t length)
{
uint8_t reg_crc = 0;
for(int i = 0; i < length; i++)
{
reg_crc ^= byteArray[i];
for(int j = 0; j < 8; j++)
{
if((reg_crc & 0x01) == 1)
{
reg_crc = (reg_crc >> 1) ^ 0xE5;
}
else
{
reg_crc = reg_crc >> 1;
}
}
}
return reg_crc;
}

Я изменил тип reg_crc в uint8_t потому что ни одна из операций, которые вы выполняете над ним, никогда не использовала вторую половину битов. Учитывая, что вы знаете, длина RX_PACKET_SIZEмы также можем дать length значение по умолчанию:

uint8_t crc_8(uint8_t* byteArray, size_t length = RX_PACKET_SIZE)
{
uint8_t reg_crc = 0;
for(int i = 0; i < length; i++)
{
reg_crc ^= byteArray[i];
for(int j = 0; j < 8; j++)
{
if((reg_crc & 0x01) == 1)
{
reg_crc = (reg_crc >> 1) ^ 0xE5;
}
else
{
reg_crc = reg_crc >> 1;
}
}
}
return reg_crc;
}

Полезная заметка на будущее:

Стандартная библиотека C ++ предоставляет класс под названием std::vector, std::vector обладает теми же возможностями, что и ArrayList в C #, но из-за того, как работают шаблоны C ++, он, вероятно, будет быстрее.

Вы можете написать перегрузку для crc_8 так что вы можете просто передать ему вектор:

// The & after std::vector<uint8_t> means that it'll pass
// by reference, instead of passing by value. Passing by
// reference is usually the preferable option because nothing
// gets copied, making it much faster.
uint8_t crc_8(std::vector<uint8_t>& bytes) {
//This calls the the version shown above
return crc_8(bytes.data(), bytes.size());
}

Если компилятор говорит, что uint8_t не определено, это потому, что вам нужно поставить #include <cstdint> в верхней части файла.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector