c - 这个奇怪的函数将字符串转换为二进制吗?

标签 c binary unsigned-char

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

我需要理解这段代码,因为我必须复制它并在另一个长度不是 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++;
                }
            }   

最佳答案

代码将包含十六进制的字符串(例如 "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 表示该数字是无符号的。

关于c - 这个奇怪的函数将字符串转换为二进制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11791078/

相关文章:

c - 为什么 substring 不是 C 标准库的一部分?

c++ - JNI如何在C/C++中调用C/C++函数?

java - “如果”和 'Else' 在 Java 中不起作用?

c++ - 将 python 列表包装为 unsigned char*

c++ - std::cout << stringstream.str()->c_str() 什么都不打印

c - 指针之间的数据

c - 在哲学家就餐中使用 Pthreads 显示死锁

java - Java 中的二进制表示

binary - 计算数字的二进制表示形式中 1 的数量的最佳方法。 (MIPS)

c - 将unsigned char数组转换为uint8_t数组?