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

运行结果如下:

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;
}

把字节流当做位流,在明确6个区,以及每个区在字节数组中对应的位的位置的情况下,分别将每个区的位数据写入对应的位位置
假设每个区都是用long long来记录(因为最长有38位),第一个区存储到字节流的0-7,即第一个字节;第二个区写入第二个字节的0-2位,以此类推。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632