C语言二进制掩码与位操作:encodingToShortString函数实现求助
解决encodingToShortString函数的实现问题
我来帮你搞定这个函数的实现,你的核心困惑应该是如何把每个数字对应的4位二进制值正确拼接成字节,对吧?咱们先梳理清楚逻辑,再修正代码:
核心思路
- 数字转4位值:每个字符
'0'到'9'要先转换成对应的0-9整数(比如'1' - '0' = 1,对应4位二进制0001)。 - 字节拼接规则:
- 若输入字符串长度为偶数:每两个连续数字组成一个字节,前一个数字的4位占字节的高4位,后一个占低4位。
- 若输入字符串长度为奇数:第一个字节的高4位补0,低4位是第一个数字的4位;剩下的数字按偶数规则每两个拼一个字节。
- 内存分配:要记得给字符串末尾的终止符
'\0'留空间,所以:- 偶数长度:
malloc(n/2 + 1)(n/2个数据字节 + 1个终止符) - 奇数长度:
malloc((n/2 + 1) + 1)(n/2+1个数据字节 + 1个终止符)
- 偶数长度:
- 字符串终止:最后必须给结果字符串加上
'\0',否则无法作为合法C字符串使用。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> char* encodingToShortString(char* dig_str) { char *short_dig_str; int n = strlen(dig_str); int j = 0; // 跟踪结果字符串的索引 // 分配内存,包含终止符空间 if (n % 2 == 0) { short_dig_str = malloc((n/2 + 1) * sizeof(char)); } else { short_dig_str = malloc((n/2 + 2) * sizeof(char)); } if (short_dig_str == NULL) { // 题目说内存充足,这里作为可选健壮性检查 return NULL; } if (n % 2 != 0) { // 奇数长度:第一个字节高4位为0,低4位是第一个数字 int first_digit = dig_str[0] - '0'; short_dig_str[j++] = (0 << 4) | first_digit; // 处理剩下的数字,每次两个 for (int i = 1; i < n; i += 2) { int d1 = dig_str[i] - '0'; int d2 = dig_str[i+1] - '0'; short_dig_str[j++] = (d1 << 4) | d2; } } else { // 偶数长度:直接每两个数字拼一个字节 for (int i = 0; i < n; i += 2) { int d1 = dig_str[i] - '0'; int d2 = dig_str[i+1] - '0'; short_dig_str[j++] = (d1 << 4) | d2; } } // 添加字符串终止符 short_dig_str[j] = '\0'; return short_dig_str; } // 测试示例 int main() { char test1[] = "1234"; char* res1 = encodingToShortString(test1); // 输出二进制验证:00010010 00110100 → 对应十六进制0x12、0x34 printf("Test 1: "); for (int i=0; i<strlen(res1); i++) { printf("%02X ", (unsigned char)res1[i]); } printf("\n"); free(res1); char test2[] = "51234"; char* res2 = encodingToShortString(test2); // 输出二进制验证:00000101 00010010 00110100 → 十六进制0x05、0x12、0x34 printf("Test 2: "); for (int i=0; i<strlen(res2); i++) { printf("%02X ", (unsigned char)res2[i]); } printf("\n"); free(res2); return 0; }
关键步骤解释
- 数字转换:
dig_str[i] - '0'是把字符形式的数字转成整数,这是因为ASCII表中'0'到'9'是连续的,差值正好是对应的数字值。 - 字节拼接:
(d1 << 4)把第一个数字的4位左移到高4位,| d2把第二个数字的4位放到低4位,这样就完成了两个4位组的拼接。 - 内存与终止符:必须为
'\0'预留空间,否则使用字符串函数(比如strlen)会导致未定义行为。 - 奇数长度处理:单独处理第一个数字,补0到高4位,剩下的部分和偶数逻辑一致。
内容的提问来源于stack exchange,提问作者Asm .
相关产品推荐
相关产品推荐

