You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言二进制掩码与位操作:encodingToShortString函数实现求助

解决encodingToShortString函数的实现问题

我来帮你搞定这个函数的实现,你的核心困惑应该是如何把每个数字对应的4位二进制值正确拼接成字节,对吧?咱们先梳理清楚逻辑,再修正代码:

核心思路

  1. 数字转4位值:每个字符'0'到'9'要先转换成对应的0-9整数(比如'1' - '0' = 1,对应4位二进制0001)。
  2. 字节拼接规则:
    • 若输入字符串长度为偶数:每两个连续数字组成一个字节,前一个数字的4位占字节的高4位,后一个占低4位。
    • 若输入字符串长度为奇数:第一个字节的高4位补0,低4位是第一个数字的4位;剩下的数字按偶数规则每两个拼一个字节。
  3. 内存分配:要记得给字符串末尾的终止符'\0'留空间,所以:
    • 偶数长度:malloc(n/2 + 1)(n/2个数据字节 + 1个终止符)
    • 奇数长度:malloc((n/2 + 1) + 1)(n/2+1个数据字节 + 1个终止符)
  4. 字符串终止:最后必须给结果字符串加上'\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 .

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:40:09