C. Расчет контрольной суммы массива шестнадцатеричных значений ASCII

Я пытаюсь вычислить контрольную сумму массива шестнадцатеричных значений ASCII.

Скажем, у меня есть следующее

char exArray[] = "3030422320303030373830434441453141542355";

Это 20 пар шестнадцатеричных значений, каждая из которых представляет собой символ ASCII (например, 0x41 = A). Как я могу разделить их, чтобы вычислить контрольную сумму?

В качестве альтернативы, как я могу объединить два значения в массиве в одно значение? (например, «4», «1» -> «41»)

Это кажется очень плохим примером, поскольку в нем нет шестнадцатеричных значений A - F. Могут ли они произойти? Что ты пробовал?

mch 26.09.2018 09:06

Первым шагом будет преобразование строкового представления (в шестнадцатеричном формате) в целое число.

pmg 26.09.2018 09:08

Для второй части попробуйте ('4' - '0') * 16 + ('1' - '0')

pmg 26.09.2018 09:09

@mch Да, могут. И я попытался перебрать массив и сохранить два символа в новый объект, но в результате у меня остались два отдельных символа.

Kater 26.09.2018 09:23

@pmg Спасибо за предложение, я попробую!

Kater 26.09.2018 09:28

Вы уверены, что массив относится к типу uint16_t? Похоже на массив char. Выдает ошибку компилятора.

Weather Vane 26.09.2018 09:28

@WeatherVane Да, извините, я неправильно записал. В моем коде это, конечно, массив char.

Kater 26.09.2018 11:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
1 009
2

Ответы 2

uint16_t exArray[] = "3030422320303030373830434441453141542355";

Я не думаю, что это делает то, что вы пытаетесь сделать. Строковый литерал рассматривается как указатель на const char. Для меня он даже не компилируется. Вот что вам нужно:

const char * exArray = "3030422320303030373830434441453141542355";

It's 20 pairs of hex values that each represent an ASCII character (eg. 0x41 = A). How can I split them up to calculate a checksum?

Вы можете перебирать массив, делая то, что вы хотите делать с двумя символами внутри цикла:

for (int i = 0; exArray[i]; i+=2) {
    printf("my chars are %c and %c\n", exArray[i], exArray[i+1]);
    // do the calculations you need here using exArray[i] and exArray[i+1]
}

Alternatively, how can I merge two values in an array to be one value? (eg. '4', '1' -> '41')

Я не понимаю, что вы здесь имеете в виду. Вы имеете в виду "41", как в строке, представляющей 41? Для этого выделите три символа, затем скопируйте эти два символа и нулевой терминатор. Что-то вроде

char hexByte[3];
hexByte[2] = 0; // setting the null terminator
for (int i = 0; exArray[i]; i+=2) {
    hexByte[0] = exArray[i];
    hexByte[1] = exArray[i+1];
    printf("the string \"hexByte\" is: %s\n", hexByte);
    // do something with hexByte here
}

Если вы хотите преобразовать его в целочисленное представление, используйте strtol:

printf("int value: %ld\n", strtol(hexByte, 0, 16));

Да, в моем коде это тоже массив символов, я неправильно его записал для примера. В любом случае, спасибо за предложение, я тоже попробую, но пока решение @pmg работает.

Kater 26.09.2018 11:16

@pmg:

First step would be converting the string representation (in hex) to an integer.

For the 2nd part, try ('4' - '0') * 16 + ('1' - '0')

Это в конечном итоге помогло, мне тоже нравится, как это просто,

Моя реализация теперь выглядит примерно так.

uint8_t t = 0, tem, tem2, sum;
uint32_t chksum = 0;

void checkSum(void)
{
    while (t < 40)
    {
        asciiToDec(exArray[t]);
        tem = global.DezAscii[0];
        t++;
        asciiToDec(exArray[t]);
        tem2 = global.DezAscii[0];
        t++;

        sum = (tem) * 16 + (tem2);
        chksum += sum;
    }
}

void asciiToDec(uint8_t value)
{
    if (value == 'A')
        global.DezAscii[0] = 10;
    else if (value == 'B')
        global.DezAscii[0] = 11;
    else if (value == 'C')
        global.DezAscii[0] = 12;
    else if (value == 'D')
        global.DezAscii[0] = 13;
    else if (value == 'E')
        global.DezAscii[0] = 14;
    else if (value == 'F')
        global.DezAscii[0] = 15;
    else
        global.DezAscii[0] = value;
}

Другие вопросы по теме