我有作业,我们应该计算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
我不知道如何解决它。
//更新它的怪异,但每次我编译不同的十进制和十六进制值我得到。
这是罪魁祸首:
hexSum = hexSum + hHexSum;
hexSum
是一个整数,用0正确初始化,直到有......
但是hHexSum
是一个char[5]
。在上面的表达式中,它衰减为指向其第一个元素的指针,因此sum的结果是指向数组中索引hexSum
的字符的指针,这不是您想要的。
您将该指针转换为整数并使用它,就像它是预期的总和,它不是。 BTW一个体面的编译器应该在这里引发警告,将.pointer转换为没有强制转换的整数。
在将strtol
添加到hHexSum
之前,您应该使用hexSum
将字符串qazxswpoi正确转换为其整数值。