zlc173968178 2022-03-31 10:53 采纳率: 100%
浏览 40
已结题

c语言按一定长度位进行对应位分区,如何把数据按区写入再存入char类型数组?

按总位数进行分区,单个区可分配1到64bit,区个数1到16个

比如总位数为96bit
要分成8,3,3,20,24,38位,共6个区
要把对应十进制48,1,6,770289,10001025,1,共6组数据分别按区写入,再存入char类型数组

结果:
化十六进制: 30, 01, 06, BC0F1, 989A81, 01
化对应二进制位:00110000 001 110 10111100000011110001 100110001001101010000001 00000000000000000000000000000000000001
再按8bit写入数组
char[0] =0x30;char[1]=0x3A,char[2]= 0xF0;
就是:303AF03C6626A04000000001

1,该如何实现功能,过程不限,只要能得到对应数组
2,由于单区最长64bit,而且接收数据为assii码,如上述数据就是0x34,0x38,0x2c,0x01,0x2c,0x06
3,例子输入就是96,8,3,3,20,24,38
48,1,6,770289,10001025,1
需要数组结果:303AF03C6626A04000000001

  • 写回答

3条回答 默认 最新

  • 关注

    运行结果如下:

    img

    代码:(因为不知道你的补齐规则,所以要求总位数必须是8的倍数,就像你例子中的96)

    #define _CRT_SECURE_NO_WARNINGS 1
    #include <stdio.h>
    
    void trans2(int n, int ws, char* buf)
    {
        int i = 0,j=0;
        char t;
        while (n)
        {
            buf[i] = '0' + n % 2;
            i++;
            n /= 2;
        }
        //补齐
        while (i < ws)
            buf[i++] = '0';
        buf[i] = 0;
        //逆序
        for (i--, j = 0; j < i; j++, i--)
        {
            t = buf[i];
            buf[i] = buf[j];
            buf[j] = t;
        }
        //printf("%s\n", buf);
    }
    
    //2进制转char,默认n是8的倍数
    int bit2char(char buf[], int n, char out[])
    {
        int s = 0, i = 0;
        int j = 0, k = 0;
        int ff = 1;
        while (i < n)
        {
            s = 0;
            ff = 1;
            for (j = 7; j >= 0; j--)
            {
                s += (buf[i + j] - '0') * ff;
                ff *= 2;
            }
            out[k++] = s;
            i += 8;
        }
        out[k] = 0;
        return k;
    }
    
    int main()
    {
        int ntotal, nfq, i; //ntotal表示总bit位数,nfq表示分区个数
        int ws[100], data[100]; //ws
        char ch, buf[1000];//buf用于保存二进制
        char output[100]; //最后输出的字符
        int nshift = 0;
        int len = 0;
    
        
        scanf("%d", &ntotal); //读取总位数
        getchar(); //吸收后面的逗号
        nfq = 0;
        while (1)
        {
            scanf("%d", &ws[nfq]);
            nfq++;
            ch = getchar();
            if (ch == '\n')
                break;
        }
        //读取每个分区的数据
        i = 0;
        while (1)
        {
            scanf("%d", &data[i]);
            i++;
            ch = getchar();
            if (ch == '\n')
                break;
        }
        if (i != nfq)
        {
            printf("分区个数跟输入数据个数不匹配\n");
            return 0;
        }
        //处理
        for (i = 0; i < nfq; i++)
        {
            trans2(data[i], ws[i], buf + nshift);
            nshift += ws[i];
        }
        //将二进制字符串转成char
        len = bit2char(buf, ntotal, output);
        for (i = 0; i < len; i++)
            printf("%02X", 0xFF & output[i]);
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月16日
  • 已采纳回答 4月8日
  • 修改了问题 3月31日
  • 修改了问题 3月31日
  • 展开全部

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看