【问题标题】:C. Checksum calculation of array of ASCII hex valuesC. ASCII 十六进制值数组的校验和计算
【发布时间】:2019-03-01 21:03:41
【问题描述】:

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

假设我有以下内容

char exArray[] = "3030422320303030373830434441453141542355";

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

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

【问题讨论】:

  • 这似乎是一个非常糟糕的例子,因为其中没有 A - F 十六进制值。它们会发生吗?你尝试了什么?
  • 第一步是将字符串表示形式(十六进制)转换为整数。
  • 第二部分,试试('4' - '0') * 16 + ('1' - '0')
  • @mch 是的,他们可以。我尝试遍历数组并将两个字符保存到一个新对象中,但这样我最终还是得到了两个单独的字符。
  • 你确定数组的类型是uint16_t吗?它看起来像一个char 数组。它会产生一个编译器错误。

标签: c arrays hex ascii checksum


【解决方案1】:

@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;
}

【讨论】:

    【解决方案2】:
    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));
    

    【讨论】:

    • 是的,在我的代码中它也是一个字符数组,我在示例中写错了。无论如何,感谢您的建议,我也会尝试那个,但现在@pmg 解决方案有效。
    猜你喜欢
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 2011-12-09
    • 2015-05-24
    • 2011-08-02
    相关资源
    最近更新 更多