C.ASCII十六进制值数组的校验和计算

时间:2018-09-26 06:58:42

标签: c arrays hex ascii checksum

我正在尝试计算ASCII十六进制值数组的校验和。

说我有以下内容

char exArray[] = "3030422320303030373830434441453141542355";

它是20对十六进制值,每对代表一个ASCII字符(例如0x41 = A)。 如何拆分它们以计算校验和?

或者,如何将数组中的两个值合并为一个值? (例如'4','1'->'41')

2 个答案:

答案 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));