0

我正在对我们系统中的旧 c 代码进行错误修复(奇怪的是,它不是标准 c。它不是由 gcc 编译的)。我来到这个代码,它似乎正在将字符串转换为无符号字符格式的二进制代码。逻辑让我感到困惑(粗体部分)。这对你们有意义吗?

我需要理解这段代码,因为我必须复制它并在另一个长度不是 13 而是 11 的字符串上重用它。

char l_call_dest_no[25];
int l_loop_cnt;
unsigned char l_bcd_byte;
unsigned char l_call_dest_no_in_bcd[13];

...some other code as input...

    for (l_loop_cnt = 0; l_loop_cnt < 13; l_loop_cnt++)
            {
                l_bcd_byte = '\0';
                switch (l_call_dest_no[l_loop_cnt * 2])
                {
                    case '0':
                    case '1':
                    case '2':
                    case '3':
                    case '4':
                    case '5':
                    case '6':
                    case '7':
                    case '8':
                    case '9':
                        l_bcd_byte = (l_call_dest_no[l_loop_cnt * 2] - 48) * 16;
                        break;
                    case 'A':
                        l_bcd_byte = 10 * 16;
                        break;
                    case 'B':
                        l_bcd_byte = 11 * 16;
                        break;
                    case 'C':
                        l_bcd_byte = 12 * 16;
                        break;
                    case 'D':
                        l_bcd_byte = 13 * 16;
                        break;
                    case 'E':
                        l_bcd_byte = 14 * 16;
                        break;
                    case 'F':
                    case ' ':
                        l_bcd_byte = 15 * 16;
                        break;
                    default:
                        printf("*** invalid call destination number ***\n");
                        return_status = FAILURE;
                        break;
                }

                if (l_loop_cnt < 12)
                {
                    switch (l_call_dest_no[l_loop_cnt * 2 + 1])
                    {
                        case '0':
                        case '1':
                        case '2':
                        case '3':
                        case '4':
                        case '5':
                        case '6':
                        case '7':
                        case '8':
                        case '9':
                            l_bcd_byte = l_bcd_byte + (l_call_dest_no[l_loop_cnt * 2 + 1] - 48) ;
                            break;
                        case 'A':
                            l_bcd_byte = l_bcd_byte + 10;
                            break;
                        case 'B':
                            l_bcd_byte = l_bcd_byte + 11;
                            break;
                        case 'C':
                            l_bcd_byte = l_bcd_byte + 12;
                            break;
                        case 'D':
                            l_bcd_byte = l_bcd_byte + 13;
                            break;
                        case 'E':
                            l_bcd_byte = l_bcd_byte + 14;
                            break;
                        case 'F':
                        case ' ':
                            l_bcd_byte = l_bcd_byte + 15;
                            break;
                        default:
                            printf("*** invalid call destination number ***\n");
                            return_status = FAILURE;
                            break;
                    }
                }
                else
                    l_bcd_byte = l_bcd_byte + 15;

                if (l_bcd_byte == 255)
                    l_call_dest_no_in_bcd[l_loop_cnt] = '\0';
                else
                {
                    l_call_dest_no_in_bcd[l_loop_cnt] = l_bcd_byte;
                        l_call_dest_no_bcd_length++;
                }
            }   
4

2 回答 2

4

该代码将包含十六进制(例如)的字符串转换"002A40FF160AD"为包含原始二进制值(例如)的字节数组{0x00, 0x2A, 0x40, 0xFF, 0x16, 0x0A, 0xDF}。该函数有一些陷阱:

  • 奇怪的是,字符串的长度不是偶数,所以在字符串的末尾暗示了一个额外的“F”。(else l_bcd_byte = l_bcd_byte + 15;)。
  • 额外的奇怪之处在于"FF"转换为 0x00。
  • 'F'和(空格)都' '被视为'F'
  • 该函数还可以作为字符串到压缩十进制 (BCD) 转换器,因为压缩十进制看起来像仅使用数字 0-9 的十六进制数(例如,十进制中的 15 是0x15压缩十进制)。但是,最终F使此功能复杂化。

编辑

最后的 F 使压缩十进制格式实际上更易于使用:压缩十进制数字末尾的 F 表示该数字是无符号的。

于 2012-08-03T07:30:46.430 回答
1

那是一个定制的 BCD 变压器。查找 BCD 格式并很好地掌握如何将数字从 BCD 格式转换为常规数字。

之后,如果您要迁移旧代码,请确保在函数中移动整个代码块。即使它有一个错误。旧代码可能取决于该错误。在您证明通向旧代码的所有代码路径都被覆盖并且没有错误之后,您可以开始修复/更改行为。

我确实有一个问题要问你,为什么它不是标准的 C 代码?gcc 在该代码上给您的错误是什么?你的 -std= 参数是什么样的?(我会通过回复你的帖子来问这个问题,但显然我不允许这样做。)

于 2012-08-03T08:25:32.157 回答