加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C语言把数据按位进行逆序排列

(2014-10-16 21:27:10)
标签:

it

分类: 程序设计
 

通过RS-32接口进行的串行通信,通常是按照低位在前、高位在后的顺序依次发送一个数据字节的各位。但是,有一些串行接口器件却刚好相反,要求数据字节按照高位在前、低位在后的顺序输入输出。为了在控制系统中与这些器件配合工作,只能利用软件的方法在主控器件将每个数据项按位进行逆序排列,即从D7D6D5D4D3D2D1D0的形式位变成D0D1D2D3D4D5D6D7的形式,然后再写入到接口器件。

在数字加密通信中,这种算法也可以用来进行加密与解密,与“异或”运算配合,以加大被破解的难度。

在汇编语言程序中,利用移位和循环移位指令,可以很方便地实现按位逆序排列,例如下面就是利用8086指令系统写出的按位逆序程序。

              MOV      AL, 37H

              MOV      CX, 8

N1:         SHL        AL, 1      AL左移一位

              RCR       BL, 1       BL带进位右移一位

              LOOP     N1          ;持续进行8

              MOV      AL, BL    ;保存结果

C语言程序中,虽然可以利用某些C编译系统中提供的移位命令(如Keil中的_RCR_等),但它们往往是一些“方言土语”,不是“标准普通话”,换个环境就可能无法使用了。

其实,利用标准ANSI C语言编译器提供的基本功能,也能实现同样的目的。本人编写的按位逆序排列程序可以读出数据文件data1.txt中的内容,逐个字节进行按位逆序处理,然后把处理结果写入data2.txt文件中,同时将变换前后的数据项在同一行上并列显示。

 下面是本人编写的小程序,可以供编程爱好者参考。

 

输入数据:

已在指定路径下保存的数据文件data1.txt

输出数据:

保存到相同路径下的数据文件data2.txt

样例输入:

Please input filename:  data1.txt

样例输出:

 

说明:输入输出时使用的都是十进制计数方式。

十进制数33的二进制代码是00100001B132的二进制代码是10000100B

  十进制数57的二进制代码是00111001B156的二进制代码是10011100B

程序代码如下:

#include

 

unsigned char reverse(unsigned char ch)

{

       unsigned char b=0;

       int key=0;

       while(key<=7)

       {

              b>>=1;

              if(ch>=0x80) b|=0x80;

              ch<<=1;

              key++;

       }

       return(b);

}

 

int main()

{

       FILE *fp1,*fp2;

       unsigned char num1[10], num2[10];

       int i;

       if((fp1 = fopen("data1.txt", "rb")) == NULL)

    {   printf("open file error\n");

        return(1);

    }

       fread(num1,sizeof(num1),10,fp1);

       printf("File open succesful!\n");

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

              printf("  %d",num1[i]);

              num2[i]=reverse(num1[i]);

              printf("  %d", num2[i]);

              printf("\n");

       }

       if((fp2 = fopen("data2.txt", "wb")) == NULL)

    {   printf("open file error\n");

        return(1);

    }

       fwrite(num2, sizeof(num2), 1, fp2);

       fclose(fp1);

       return(0);

}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有