我正在尝试计算ASCII十六进制值数组的校验和。
说我有以下内容
char exArray[] = "3030422320303030373830434441453141542355";
它是20对十六进制值,每对代表一个ASCII字符(例如0x41 = A)。 如何拆分它们以计算校验和?
或者,如何将数组中的两个值合并为一个值? (例如'4','1'->'41')
答案 0 :(得分:2)
@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;
}
答案 1 :(得分:1)
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));