Я пытаюсь вычислить контрольную сумму массива шестнадцатеричных значений ASCII.
Скажем, у меня есть следующее
char exArray[] = "3030422320303030373830434441453141542355";
Это 20 пар шестнадцатеричных значений, каждая из которых представляет собой символ ASCII (например, 0x41 = A). Как я могу разделить их, чтобы вычислить контрольную сумму?
В качестве альтернативы, как я могу объединить два значения в массиве в одно значение? (например, «4», «1» -> «41»)
Первым шагом будет преобразование строкового представления (в шестнадцатеричном формате) в целое число.
Для второй части попробуйте ('4' - '0') * 16 + ('1' - '0')
@mch Да, могут. И я попытался перебрать массив и сохранить два символа в новый объект, но в результате у меня остались два отдельных символа.
@pmg Спасибо за предложение, я попробую!
Вы уверены, что массив относится к типу uint16_t? Похоже на массив char. Выдает ошибку компилятора.
@WeatherVane Да, извините, я неправильно записал. В моем коде это, конечно, массив char.





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 работает.
@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;
}
Это кажется очень плохим примером, поскольку в нем нет шестнадцатеричных значений
A-F. Могут ли они произойти? Что ты пробовал?