Как добавить шестнадцатеричные числа - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть домашнее задание, где мы должны вычислить контрольную сумму INTEL HEX.Но я не знаю, как добавить шестнадцатеричные числа.

char string[100] = ":10010000214601360121470136007EFE09D2190\n";
char hLength[5] = "0x", hHexSum[5] = "0x";
long length;
int i, hexSum = 0x0,x;

// We create hex format from first two numbers
hLength[2] = string[1];
hLength[3] = string[2];
hLength[4] = 0;

// Convert hex to dec number
length = (strtol(hLength, 0, 0))*2;
x = strlen(string);

// Add all hex numbers
for (i = 1; i <= (x-1); i++)
{
    hHexSum[2] = string[i];
    hHexSum[3] = string[i+1];
    hHexSum[4] = 0;
    printf("%d + %s ", hexSum, hHexSum);
    hexSum = hexSum + hHexSum;
    i = i + 1;
    printf("DEC = %d; HEX = %x\n", hexSum, hexSum);
}

printf("%#08x\n", hexSum);

system("pause");
return 0;

Вывод теперь:

0 + 0x10 DEC = 7338140; HEX = 6ff89c
7338140 + 0x01 DEC = 14676280; HEX = dff138
14676280 + 0x00 DEC = 22014420; HEX = 14fe9d4 
... and more   

Но если я прав, правильный вывод должен быть

0 + 0x10 DEC = 16; HEX = 10
... and more

И я не знаю, как мне это исправить.

// ОБНОВЛЕНИЕ странно, но я получаю каждый раз, когда компилирую разные значения dec и hex.

1 Ответ

0 голосов
/ 17 февраля 2019

Вот виновник:

hexSum = hexSum + hHexSum;

hexSum - это целое число, правильно инициализированное 0, хорошо до тех пор, пока ...

, но hHexSum - это char[5],В вышеприведенном выражении он распадается на указатель на свой первый элемент, поэтому результатом суммы является указатель на символ индекса hexSum в массиве, который не тот, который вы хотите.

Вы конвертируетеэтот указатель на целое число и использовать его, как если бы это была ожидаемая сумма, что это не так.Кстати, приличный компилятор должен выдавать предупреждение здесь для преобразования .pointer в целое число без приведения .

Вы должны использовать strtol, чтобы правильно преобразовать строку hHexSum в ее целое число значение перед добавлением его к hexSum.

...