按总位数进行分区,单个区可分配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
运行结果如下:
代码:(因为不知道你的补齐规则,所以要求总位数必须是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位,以此类推。