查看: 1479|回复: 4
收起左侧

[已解决] 对字符串进行位运算,用C语言怎么写?

[复制链接]
jiuzai0
发表于 2018-8-8 18:51:38 | 显示全部楼层 |阅读模式
本帖最后由 jiuzai0 于 2018-8-9 18:45 编辑

一个长度为12个字节的字符串"abcdefghijkl",把这段8*12bit长度的数据的偶数位(二进制位)变成0,即进行位运算。因为逐个字节运算速度慢,我想每次运算4个字节(即32bit)。使用循环,每次运算4个字节,当然是循环3次。我的办法是,把每4个字节看作一个long整型数据,位运算之后,使用memcpy()函数把结果拷贝到目标指针上。这样循环3次。下面写的代码,得不到正确的结果。
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. /**
  5. * 打印数值二进制值的函数
  6. **/
  7. void printNumber(unsigned long n, int length)
  8. {
  9.     char str[length];
  10.     itoa(n,str,2);//2即是代表转换为2进制
  11.     //补足前面的0
  12.     int count = length - strlen(str);
  13.     int i;
  14.     for(i=0; i<count; ++i)
  15.     {
  16.         printf("0");
  17.     }
  18.     //
  19.     printf("%s",str);
  20. }

  21. /**
  22. * 打印字符串二进制值的函数
  23. **/
  24. void printString(char *s)
  25. {
  26.     char c;
  27.     unsigned long j=(unsigned long)s + strlen(s);
  28.     for(; (unsigned long)s<j; s++)
  29.     {
  30.         c = *s;
  31.         printNumber((unsigned long)c, 8);
  32.     }
  33. }

  34. /**
  35. * 主函数
  36. */
  37. int main(int argc, char *argv[])
  38. {
  39.         unsigned int length= 8;
  40.     char src[8] = "abcdefgh";
  41.     char dest[8] = "tttttttt";        //存放结果
  42.     unsigned long* srcLong = src;
  43.     unsigned long* destLong = dest;
  44.     //
  45.     unsigned long key1 = 0xaaaaaaaa;                //1010....
  46.     unsigned long n;
  47.     //
  48.     printNumber(key1, 32);printNumber(key1, 32); puts(":key1");
  49.     printString(src); puts(":src");
  50.     //
  51.     //unsigned long * endLong = src + 8;
  52.         unsigned int count = length/4;
  53.         unsigned int i;
  54.     for(i=0; i<count; i++) //srcLong < endLong
  55.     {
  56.         n = (*srcLong) & key1;
  57.         //printString((char*)&n);
  58.         memcpy((void *)destLong, (void *)&n, 4);
  59.         srcLong += 4;
  60.                 destLong +=4;
  61.     }
  62.         printString(dest); puts(":dest");


  63.     return 0;
  64. }
复制代码


85683213
发表于 2018-8-8 19:05:35 | 显示全部楼层
本帖最后由 85683213 于 2018-8-8 19:18 编辑

不知道是不是我理解错误
这东西不是用and就好了吗

------------------------------
好吧,我承认刚刚没看你的Code
蜀黍冷
发表于 2018-8-9 09:09:24 | 显示全部楼层
额,我能说这个代码看的我头皮发麻吗
mlisonmalional
发表于 2018-8-9 13:52:35 来自手机 | 显示全部楼层
我觉得你这个强制转换有问题
www-tekeze
发表于 2018-8-9 16:24:18 | 显示全部楼层
虽然是答疑区,但短时想得到准确结果估计难,到看雪发帖可能更合适,要不楼主@下几位厂商的官人?
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2024-11-25 15:45 , Processed in 0.139971 second(s), 16 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表