关于异或的送分题目

shanying_0 2008-12-06 05:29:38
比如我有个比特流,比如说是101010101110010101010110101。然后存放在一个byte[]中
还有个数是0x1201,如何实现0x1201与这个比特流的疑惑运算!!
那位大哥给写个算法了。谢谢了。如算法合适的话。100分送上。让后追加100分
顶的朋友,同样有分!!!
...全文
511 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
EveryCase 2009-02-06
  • 打赏
  • 举报
回复
只能按字节来处理。不够的0补充上!!!
jyh_baoding 2008-12-10
  • 打赏
  • 举报
回复
把比特流按字符取,每16为取一次,和给定的值异或,依次循环,取最后结果
yanghy2013 2008-12-08
  • 打赏
  • 举报
回复
上面代码写了很多了,帮顶下
只要字节对齐异或就可以了
someon 2008-12-08
  • 打赏
  • 举报
回复
up
学习
rookieme 2008-12-08
  • 打赏
  • 举报
回复
有点小错误,改了一下
一种典型的循环加/解密算法:明文与密码按字节循环异或则加密,两次异或为解密,明文的字节数没有字节对齐的要求
[Quote=引用 6 楼 rookieme 的回复:]
typedef union _U_XORDATA{//定义一个联合便于对密码按字节操作
unsigned char s[2];//此处改了
unsigned short i;//改了
}U_XORDATA;

byte* xorbyte(byte *buffer,int iLength)
//buffer为需异或的比特流(明文),iLength为比特流长度(字节作单位),调用后明文变为密文,存放位置不变
{
U_XORDATA udat;
int k=0,i;
udat.i=0x1201;//需异或的常数:密码
byte c;
for(i=0;i <iLength;i++) //依次按字节取明文进行异或运算
{
c=udat.s[k++];//取密码的一个字节,字节序号自动累加
buffer[i]=buffer[i]^c;//异或运算
if(k==2)k=0;//密码字节序号归零
}
return (byte*)buffer;//返回密文
}
[/Quote]
roadblossom 2008-12-07
  • 打赏
  • 举报
回复
up
Fireway2008 2008-12-07
  • 打赏
  • 举报
回复
PWORD->PDWORD
就按楼上说的,把代码加入函数并加断点进行测试,跟踪变量察看其值,就知道该算法的意义了。
cnzdgs 2008-12-07
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 shanying_0 的回复:]
引用 7 楼 cnzdgs 的回复:
C/C++ codeWORD value = 0x1201;
PWORD src = (PWORD)SrcData;
PWORD dest = (PWORD)DestData;
int length = (int)DataLength/2;
for (int i=0; i <length; i++)
{
dest[i] = src[i] ^ value;
}


这个看着好模糊呀。大哥能不能补充一下。你弄出一些变量来很难看!!
你这个是按位来处理的么?
[/Quote]
假设SrcData是源数据指针,DestData是储存处理后数据的指针,DataLength是要处理的字节数,value是要异或的数值,因为数值为0x1201,通常应该是按WORD来操作,所以把指针都转换为PDWORD型,把长度除以2,循环里面就是逐个WORD与0x1201相异或。
ilovedrv 2008-12-07
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 shanying_0 的回复:]
我现在异或0x1201是不是要弄成2字节的倍数。还是怎么着!!!
[/Quote]

4字节,这个速度最快
ilovedrv 2008-12-07
  • 打赏
  • 举报
回复
1. 把流字符串扩展为4字节倍数,尾部补零

2. 按4字节unsigned long 方式,for循环异或0x12011201

xor函数:

void test_xor(unsigned char *src_buf, unsigned char *dest_buf, int length, unsigned long factor)
{
ASSERT(src_buf && dest_buf);
ASSERT(length % sizeof(unsigned long) == 0);

int count = length / sizeof(unsigned long);
unsigned long *src_ptr = (unsigned long *)src_buf;
unsigned long *dest_ptr = (unsigned long *)dest_buf;

for (int i = 0; i < count; ++i)
{
dest_ptr[i] = src_ptr[i] ^ factor;
}
}


调用示例:


#define BUF_SIZE 256

unsigned char src[BUF_SIZE];
unsigned char dest[BUF_SIZE];

test_xor(src, dest, BUF_SIZE, 0x12011201);
scq2099yt 2008-12-07
  • 打赏
  • 举报
回复
up
Show_Mike 2008-12-07
  • 打赏
  • 举报
回复
感觉上述处理有点问题:主要是0x1201的处理上.我个人看法应该是,0x1201转换为周期性二进位流,然后与byte[]中数据流逐位异或.
season030441 2008-12-07
  • 打赏
  • 举报
回复
是不是数据对齐后直接a^b就可以了
qap22 2008-12-06
  • 打赏
  • 举报
回复
不懂,帮顶
qap22 2008-12-06
  • 打赏
  • 举报
回复
up
qap22 2008-12-06
  • 打赏
  • 举报
回复
不懂,up
liuyuanyang 2008-12-06
  • 打赏
  • 举报
回复
帮顶上!
无能为力#@%%U&^^^^^^^^^^%*
cnzdgs 2008-12-06
  • 打赏
  • 举报
回复
WORD value = 0x1201;
PWORD src = (PWORD)SrcData;
PWORD dest = (PWORD)DestData;
int length = (int)DataLength/2;
for (int i=0; i<length; i++)
{
dest[i] = src[i] ^ value;
}
rookieme 2008-12-06
  • 打赏
  • 举报
回复
typedef union _U_XORDATA{
unsigned char s[4];
unsigned int i;
}U_XORDATA;

byte* xorbyte(byte *buffer,int iLength)
//buffer为需异或的比特流,iLength为比特流长度
{
U_XORDATA udat;
int k=0,i;
udat.i=0x1201;//需异或的常数
byte c;
for(i=0;i<iLength;i++)
{
c=udat.s[k++];
buffer[i]=buffer[i]^c;
if(k==4)k=0;
}
return (byte*)buffer;
}
hurryboylqs 2008-12-06
  • 打赏
  • 举报
回复
^
加载更多回复(3)

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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