用C将一个256位数转成64位的方法,求实现!
组长叫我实现一个将256位的数转换为64位的数!
大概的方法是:将256的数提取前6位,组合成新的数。
例如:0xC1 0xF5 0x41(1100 0001 1111 0101 0100 0001)转变成:
110000 011111 010101 000001,这样就变成了0X30 0X1F 0x15 0x01
再例如:0x31(0011 0001)转变成001100 010000,变成0x0C 0x10
大概就是这样的个情况!
本人C语言写的不是很多,以前都是搞搞C++,写了半天都没有写出完整的。
希望能有人帮我实现下。
不胜感激! c
[解决办法]
问题能描述清楚点么?256位的数转换为64位,应该是数据变短,而后边的例子,是数据变长。。。。
[解决办法]
一个将256位的数转换为64位的数
这个具体是什么意思? 要截取前面的还是后面的?
[解决办法]
给你举个例子吧,比如有
unsigned char a;
unsigned char b;
你需要把a的高6位放到低位,b的低2位放到高位,组成新的
unsigned char c;
那么可以很简单的这样运算:
c = ((a >> 2) & 0x3f)
[解决办法]
((b << 6) & 0xc0);
如果没有用过位运算的话,那么建议先去了解一下位运算的基本法则
[解决办法]
另外你可以用sizeof去测试你的类型到底是多少位,例如:
unsigned int a;
int bits = sizeof(a) * 8;
给你举个例子吧,比如有
unsigned char a;
unsigned char b;
你需要把a的高6位放到低位,b的低2位放到高位,组成新的
unsigned char c;
那么可以很简单的这样运算:
c = ((a >> 2) & 0x3f)
[解决办法]
((b << 6) & 0xc0);
如果没有用过位运算的话,那么建议先去了解一下位运算的基本法则
需求再弄清楚一点吧,总的来说,你的问题只需要用数组和位运算就可以解决的。
组长叫我实现一个将256位的数转换为64位的数!
大概的方法是:将256的数提取前6位,组合成新的数。
例如:0xC1 0xF5 0x41(1100 0001 1111 0101 0100 0001)转变成:
110000 011111 010101 000001,这样就变成了0X30 0X1F 0x15 0x01
再例如:0x31(0011 0001)转变成001100 010000,变成0x0C 0x10
大概就是这样的个情况!
本人C语言写的不是很多,以前都是搞搞C++,写了半天都没有写出完整的。
希望能有人帮我实现下。
不胜感激!
这个是具体的算法。后面还要转!不过后面的要简单点了。
就是这个左移6位写了半天没写出来。
256位转64位各位就当没说,主要是这个算法。
谢谢啊!
这个我都知道。
就是感觉不知道怎么得到一个数到底有多少位。
[解决办法]
256除6除不尽啊 每六位操作 移位就可以了啊,很简单的
我也知道是移位,但是你不知道到底最后要加几个0.
这个问题我再去问问组长,
感觉他说256说的是给的数最大是256位,
就是说我现在不知道这个数有多少位。
懂我的意思了吗?
256好办 位数不确定就必须要给出终止条件
[解决办法]
组长叫我实现一个将256位的数转换为64位的数!
大概的方法是:将256的数提取前6位,组合成新的数。
例如:0xC1 0xF5 0x41(1100 0001 1111 0101 0100 0001)转变成:
110000 011111 010101 000001,这样就变成了0X30 0X1F 0x15 0x01
再例如:0x31(0011 0001)转变成001100 010000,变成0x0C 0x10
大概就是这样的个情况!
本人C语言写的不是很多,以前都是搞搞C++,写了半天都没有写出完整的。
希望能有人帮我实现下。
不胜感激!
LZ你是要将64位转为256位吧?
[解决办法]
仅供参考
//有一个二进制文件,要求每隔50bits,删除后面的12bits。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *fi,*fo;
char buf[31];
char obf[31];
int bn,n;
void filter() {//对buf中前n个字节中的位,每隔50bits,忽略12bits,结果放在obf中,且将bn设置为obf中的字节数。
char bit[249];
char obt[249];
char b8[33];
char b88[33];
int i,j;
char *e;
for (i=0;i<n;i++) {
_itoa(buf[i],b8,2);
sprintf(b88,"%032s",b8);
sprintf(bit+i*8,"%s",b88+24);
}
j=0;
for (i=0;i<n*8;i++) {
if (i%62<50) {
obt[j]=bit[i];
j++;
}
}
if (j%8) {
bn=(j/8+1)*8;
} else {
bn=j;
}
for (i=j;i<bn;i++) obt[i]='0';
obt[bn]=0;
bn=bn/8;
for (i=0;i<bn;i++) {
strncpy(b8,obt+i*8,8);b8[8]=0;
obf[i]=(char)strtol(b8,&e,2);
}
}
int main() {
fi=fopen("in.bin","rb");
if (NULL==fi) {
printf("Can not open file in.bin!\n");
return 1;
}
fo=fopen("out.bin","wb");
if (NULL==fo) {
fclose(fi);
printf("Can not open file out.bin!\n");
return 2;
}
while (1) {
n=fread(buf,1,31,fi);
if (0==n) break;
filter();
fwrite(obf,1,bn,fo);
}
fclose(fo);
fclose(fi);
return 0;
}
[解决办法]
仅供参考
不知道是不是楼主要的
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int main(int argc,char *argv[])
{
int a,i,count,*num,j=0,k=0;
int m=1;
int n=0;
char buf[100]={0},buf1[100]={0};
scanf("%x",&a);
itoa(a,buf,2);
if(strlen(buf)%4!=0)
{
count=(strlen(buf)/4+1)*4%strlen(buf);
memcpy(buf+count,buf,strlen(buf));
for (i=0;i<count;i++)
{
buf[i]='0';
}
}
if (strlen(buf)%6!=0)
{
a=a<<( (strlen(buf)/6+1)*2%(strlen(buf)));
}
itoa(a,buf,2);
if(strlen(buf)%4!=0)
{
count=(strlen(buf)/4+1)*4%strlen(buf);
memcpy(buf+count,buf,strlen(buf));
for (i=0;i<count;i++)
{
buf[i]='0';
}
}
num=(int *)malloc(strlen(buf)/6);
memset(num,0,strlen(buf)/6);
for (i=0;i<strlen(buf)/6;i++)
{
num[i]=0;
}
i=0;
j=5;
while(buf[k]!='\0')
{
count=pow(2.0,j);
num[i]+=(buf[k]-'0')*count;
j--;
k++;
if (j==-1)
{
i++;
j=5;
}
}
for (i=0;i<strlen(buf)/6;i++)
{
printf("%x \n",num[i]);
}
return 0;
}
for (i=0;i<strlen(buf)/6;i++) { printf("%02x \n",num[i]); }
如果要在前面补0的话可以向上面那么写
刚刚运行了下!果然是对的啊!好犀利啊!
太感谢了啊!
我看你很多位置*4%strlen(buf);或者*2%strlen(buf);这个不是很懂!
能讲下你的思路吗?
太感谢你了!
我写了半天都写不对!
POW是系统的函数pow(x,y) 求x的y次幂。
思路大概是这样的。。
先输入一个 16进制的数,然后转换为2进制的。
if(strlen(buf)%4!=0)
{
count=(strlen(buf)/4+1)*4%strlen(buf);
memcpy(buf+count,buf,strlen(buf));
for (i=0;i<count;i++)
{
buf[i]='0';
}
}
这里是因为itoa会去掉2进制前面的0,所以得把前面的0补上
if (strlen(buf)%6!=0)
{
a=a<<( (strlen(buf)/6+1)*2%(strlen(buf)));
}
这里是 4位转6位然后补0
有一个缺点就是,输入的16进制数要在int的范围内,不然会出错