大侠们,帮帮我吧,在线跪求了!!!tc的编程问题

gaga16 2007-11-01 11:45:56
要输入2个32个字符长度的变量,有数字也有字母,比如a='1234addgeyy'等等

然后要对这2个变量 异或,出来一个也是32个长度的新变量

这个怎么编啊,是不是这里的32个字符,就是32位啊?我看看了,好像要先转成ascii,再转成16进制,再异或,是这样吗?
在线跪求,明天就要啊!!!!
...全文
119 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ttlyfast 2007-11-02
  • 打赏
  • 举报
回复
又是作业题来的 
wankong 2007-11-02
  • 打赏
  • 举报
回复
比如'0'是00110001,'1'是00110010,这两个按位异或就是'0'^'1'结果是00000011,所有的分量不论多少位,都可以这样异或,所以只要给定了两个等长的分量,不论是什么形式,对计算机来说,只要执行如上的按位异或运算就可以了,你理解的运算没有问题,是正确的,比如32个32位数字,分别按位异或:
long int a[31],b[31]
赋值后,可以循环a[i]^b[i]32次,就是新的结果保存到c[i],这里可以认为是32个datatype a[31],b[31].
取什么datatype由需要来定,最小可以是1个BIT,最大可以是256位或者512位等等,根据加密的要求喽。
fengshl 2007-11-02
  • 打赏
  • 举报
回复
内存中的数都是01组成的,要多少进制的自己取出来格式下,就是啦
gaga16 2007-11-02
  • 打赏
  • 举报
回复
谢谢给我个例子,我研究研究,不过好像不是这样的

我可能表达的不清楚,好像就是把字符串从第一位开始,每位转换成16进制,然后异或

我不知道怎么吧 CHAR *STR1='123A' 转换成 TEMP[3] TEMP[0]=0X01,TEMP[1]=0X02,TEMP[2]=0X03,TEMP[3]=0X0A
Treazy 2007-11-02
  • 打赏
  • 举报
回复
没有用到任何库函数
只有一个printf用来调试
功能实现代码如下:

#define LEN 32

char Result[LEN];

char AsciiToBin(char Ascii)
{
char Bin = 0xFF;
switch(Ascii)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
Bin = Ascii - 0x30;
break;
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
Bin = Ascii - 'a' + 0x0A;
break;
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
Bin = Ascii - 'A' + 0x0A;
break;
}
return Bin;
}
void Fun(char *Data1, char *Data2)
{
int i;

for(i = 0; i < LEN; i++)
{

Result[i] = AsciiToBin(*(Data1 + i)) ^ AsciiToBin(*(Data2 + i));
printf("%x", Result[i]);
}
}

main()
{
char *s1 = "F2222222222222222222222222222222";
char *s2 = "00000000000000000000000000000000";
Fun(s1, s2);
}


gaga16 2007-11-02
  • 打赏
  • 举报
回复
没有明白,本人对位的概念很模糊啊,不好意思,看我上面的那个帖子了吗?就是那个意思

估计大家还不明白,就是
比如 CHAR *STR1= '12A '; 0X01,0X02,0X0A
CHAR *STR2= '02B '; 0X00,0X02,0X0B

然后异或 0X01^0X00 0X02^0X02 0X0A^0X0B

大家明白了吗?
wankong 2007-11-02
  • 打赏
  • 举报
回复

int main(void)
{
char a[32]="1avc";
char b[32]="2de5";
char c[32];
int i;
for(i=0;i<=31;i++)
{
if(a[i]==0)
{
c[i]=0;
break;
}
c[i]=a[i]^b[i];
}
for(i=0;i<=31;i++)
{
if((a[i]==0)&&(c[i]==0))
break;
cout<<(int)c[i]<<" ";
}
cout<<endl;
return 0;
}


比如这样,就是32个bit分量的两个密钥异或生成新的密钥。
wankong 2007-11-02
  • 打赏
  • 举报
回复
我想分量需要你再结合其他情况来确定了,我想应该是有32个部分组成的长的数字,比如32个16位,32个8位,32个4位等等。一共有两组,这两组先按照分量,按位异或,然后再用这个新的32个长度的分量来加密。
gaga16 2007-11-02
  • 打赏
  • 举报
回复
估计大家还不明白,就是
比如 CHAR *STR1='12A'; 0X01,0X02,0X0A
CHAR *STR2='02B'; 0X00,0X02,0X0B

然后异或 0X01^0X00 0X02^0X02 0X0A^0X0B

大家明白了吗?

wankong 2007-11-02
  • 打赏
  • 举报
回复
这个有点象加密方面的东西,按照题目来说是要求32个字符的,不过程序测试时候可以只是两个随意的等长字符串。
不相等的话,比较麻烦,因为可能存在后面字符为未定义字符,结果受到影响。
字符形式输出的话,可能会出现很多的无法识别字符,认为应该使用16进制比较直观。
gaga16 2007-11-02
  • 打赏
  • 举报
回复
我把整个的题目说一下吧
输入2个32个长度的分量(定长,2个密钥),进行异或生成一个32个长度的新的密钥,然后进行3des加密

我理解的是32个长度应该是32位,比如32个2,和32个0 异或就是32个2,应为是参数传入所以都是字符串形式的
不知道这样说明白了吗?感谢大家啊!!!
Treazy 2007-11-02
  • 打赏
  • 举报
回复
要输入2个32个字符长度的变量,有数字也有字母,比如a= '1234addgeyy '等等

然后要对这2个变量 异或,出来一个也是32个长度的新变量
--------------------------------------------------------------
问题1:32个字符长度,这个是特定的?还是最大长度是32,可以只输入若干字符?
问题2:若2个字符串长度不相等,那如何异或?还是字符串直接按字节进行异或?
问题3:最后输出新变量,是以字符串输出?还是是以其他输出?
wankong 2007-11-02
  • 打赏
  • 举报
回复
是32个字符,不知道具体题目要求,按照道理,应该是直接两个字符串对应的进行异或运算,char类型支持异或按位,直接操作就可以了。
for(int i=0;i<=31;i++)
{
c[i]=a[i]^b[i];
}
如果我没有理解错误,这样好像就可以。
gaga16 2007-11-02
  • 打赏
  • 举报
回复
没有人啊,真的很着急啊!!!
gaga16 2007-11-02
  • 打赏
  • 举报
回复
还有一个问题,不好意思,就是上面的例子Result按16进制输出,
那假如Result就是前16个是1,后16个是2,怎么分成2组16进制的数组

KEYA[0]=0X11;
KEYA[1]=0X11;




KEYA[7]=0X11;

KEYB[0]=0X22;
KEYB[1]=0X22;
...
KEYB[7]=0X22;

就是Result0-15 ,16-31分开

是不是要用移位的运算啊, KEYA[0]=KEY[0]<<1,KEYA[0]=KEYA[0]+KEYA[1] 这样能出上面的结果吗?

希望大侠们明白啊!!!!


xaobao 2007-11-02
  • 打赏
  • 举报
回复
wankong
海子
的程序思路是对,32位密钥为16个16进制数字. 把16进制转ASCII码(一个ASCII为两个二进制数)再进行异或,取两个数的ASCII码转换成16进制数.
原理应该是这样的.ASCII转16进制的网上有.
gaga16 2007-11-02
  • 打赏
  • 举报
回复
谢谢了,不过还是想知道怎么编程我说的那个样子,
还有一个问题就是,比如刚才算出result[i]是16进制的吗?

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧