我有作业,应该计算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值。

最佳答案

罪魁祸首:

hexSum = hexSum + hHexSum;


hexSum是一个整数,正确地初始化为0,可以精确到直到...

但是hHexSumchar[5]。在上面的表达式中,它衰减到指向第一个元素的指针,因此求和的结果是指向数组中索引hexSum的字符的指针,这不是您想要的。

您将该指针转换为整数,然后将其用作期望的总和,而不是期望的总和。顺便说一句,像样的编译器应在此处提出警告,要求将.pointer转换为整数而不进行强制转换。

在将字符串strtol添加到hHexSum之前,应该使用hexSum正确地将字符串转换为其整数值。

08-16 08:28