C. Расчет контрольной суммы массива шестнадцатеричных значений ASCII - PullRequest
0 голосов
/ 26 сентября 2018

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

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

char exArray[] = "3030422320303030373830434441453141542355";

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

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

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

@ pmg:

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

Для второй части попытайтесь ('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;
}
0 голосов
/ 26 сентября 2018
uint16_t exArray[] = "3030422320303030373830434441453141542355";

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

const char * exArray = "3030422320303030373830434441453141542355";

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

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

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]
}

В качестве альтернативы, как я могу объединить два значения в массиве в одно значение?(например, «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));
...