我正在对我们系统中的旧 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/