Преобразование массива char в массив uint16_t C / C ++ - PullRequest
0 голосов
/ 20 апреля 2020

Я написал приведенный ниже код для преобразования и сохранения данных из строки (массива символов) с именем str в массив 16-разрядных целых чисел с именем arr16bit

Код работает. Однако я бы сказал, что есть лучший или более чистый способ реализовать эту логику c, используя меньше переменных и т.д. c.

Я не хочу использовать индекс i, чтобы получить модуль% 2, потому что при использовании байтов с прямым порядком байтов у меня тот же алгоритм, но i начинается с последнего индекса строки и ведет обратный отсчет вместо того, чтобы. Любые рекомендации приветствуются.

// assuming str had already been initialised before this ..

int strLength        = CalculateStringLength(str);      // function implementation now shown 
uint16_t*  arr16bit  = new uint16_t[ (strLength /2) + 1];  // The only C++ feature used here , so I didn't want to tag it
int indexWrite       = 0;
int counter          = 0;

for(int i = 0; i < strLength; ++i)
{
    arr16bit[indexWrite] <<= 8;
    arr16bit[indexWrite] |= str[i];
    if ( (counter  % 2) != 0)
    {
        indexWrite++;
    }
    counter++;
}

1 Ответ

1 голос
/ 20 апреля 2020

Да, здесь есть несколько избыточных переменных.

У вас есть и counter, и i, которые делают одно и то же и всегда содержат одно и то же значение. И у вас есть indexWrite, что всегда равно половине (на целое деление) их обоих.

Вы также сдвигаетесь слишком далеко (16 бит, а не 8).

const std::size_t strLength = CalculateStringLength(str);
std::vector<uint16_t> arr16bit((strLength/2) + 1);

for (std::size_t i = 0; i < strLength; ++i)
{
    arr16bit[i/2] <<= 8;
    arr16bit[i/2] |= str[i];
}

Хотя я бы, вероятно, сделал это больше так, чтобы избежать N избыточных |= операций:

const std::size_t strLength = CalculateStringLength(str);
std::vector<uint16_t> arr16bit((strLength/2) + 1);

for (std::size_t i = 0; i < strLength+1; i += 2)
{
    arr16bit[i/2]      = (str[i] << 8);
    arr16bit[(i/2)+1] |= str[i+1];
}

Вы также можете sh рассмотреть простой std::copy над весь чертов буфер, если ваша порядочность правильная.

...