ATA(代码)

原创 2007年09月22日 23:19:00
  1. 编码转换:GBK码转UCS2码    和 UCS2码转GBK码(第一次用类来写,封装得很糟糕)
  2. #include <string.h>
    #include <iostream.h>

    #define N 100
    class coding
    {
    public:
        coding()
        {
           
        }
        ~coding()
        {

        }
        void Initunstr(char *string)
        {
           
            unstr=string;
            length=strlen(unstr);
        }
        void Initstr(char *string)
        {
            str=string;
            length=strlen(string);
        }
        void UCS2_GBK()
        {
            if(length == 0)
                exit(1);
            char buf[N];
            ZeroMemory(buf,N);        
            int i,len;
            //高低字节交换位置
            for(i = 0; i < length-1; i += 2)
            {
                buf[i+1]=unstr[i];
                buf[i]=unstr[i+1];
            }
            len = WideCharToMultiByte(CP_ACP, 0L, (unsigned short *)&buf[0], -1, unstr, 0, NULL, NULL);  
            str=(char *)malloc(len*sizeof(char)+1);
            WideCharToMultiByte(CP_ACP, 0L, (unsigned short *)&buf[0], -1, str, len, NULL, NULL);       

        }
        void GBK_UCS2()
        {
            if(!length)
                exit(1);
            char buf[N],*buftemp;
            ZeroMemory(buf,N);
            int i, len;
            len=MultiByteToWideChar(CP_ACP,0L,str,-1, (unsigned short *)&buf[0], 0);
            MultiByteToWideChar(CP_ACP,0L,str,-1, (unsigned short *)&buf[0], len);
            unstr=(char *)malloc(2*len*sizeof(char));
            buftemp=(char *)malloc(2*len*sizeof(char));
           
            len--;
            for(i=0;i < (len*2); i += 2)
            {
                buftemp[i]=buf[i+1];
                buftemp[i+1]=buf[i];
            }
            for(i=0;i< 2*len;i++)

                unstr[i]=buftemp[i];
            unstr[i]='/0';

           
        }
        char * getstr()
        {
            return str;
        }
        char* getunstr()
        {
            return unstr;
        }
    private:
       
        char *str;
        char *unstr;
        int length;
    };   

    /*int main()
    {
        coding code;
        char *string=new char(N);
        cin>>string;
        code.Initunstr(string);
        code.UCS2_GBK();
    //    code.printstr();
    //    code.Initstr("慢");
    //    code.GBK_UCS2();
        string=code.getstr();
        cout<<string<<endl;
        code.Initstr(string);
        code.GBK_UCS2();
        cout<<code.getunstr()<<endl;
        return 0;
    }*/
  3. MD5算法加密  核心是网上搜来的,里面涉及到很多宏定义,本想拆成const,但是这个编译时还有类型检查,很难实现,于是就放一块了,做成了.hpp文件,直接调用函数就好
  4. /*我做的修改就是接口的更改!**/
    /*让它接受已个字符串然后将该字符串加密处理的信息以字符串形式输出*/
    /*设计思想是通过中间文件进行转换,先将字符串写入文件,再让代码处理文件加密,再将加密信息读入文件,再将信息从文件中读出*/
    /*这个是HPP文件,也就是算法的实现过程,test是个测试函数*/
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>

    #define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
    #define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
    #define H(x, y, z) ((x) ^ (y) ^ (z))
    #define I(x, y, z) ((y) ^ ((x) | (~z)))

    #define RL(x, y) (((x) << (y)) | ((x) >> (32 - (y))))  //x向左循环移y位

    #define PP(x) (x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24)  //将x高低位互换,例如PP(aabbccdd)=ddccbbaa

    #define FF(a, b, c, d, x, s, ac) a = b + (RL((a + F(b,c,d) + x + ac),s))
    #define GG(a, b, c, d, x, s, ac) a = b + (RL((a + G(b,c,d) + x + ac),s))
    #define HH(a, b, c, d, x, s, ac) a = b + (RL((a + H(b,c,d) + x + ac),s))
    #define II(a, b, c, d, x, s, ac) a = b + (RL((a + I(b,c,d) + x + ac),s))

    unsigned A,B,C,D,a,b,c,d,i,len,flen[2],x[16];   //i临时变量,len文件长,flen[2]为64位二进制表示的文件初始长度
    char FileName[]="temp.dat";   //文件名
    FILE *fp;
    void ChangeToFile(const char *s)
    {
        fp=fopen(FileName,"w+");
        if(fp==NULL)
        {
            printf("The temp file can't creat!/n");
            exit(0);
        }
        else
        {
            fprintf(fp,"%s",s);
            fclose(fp);
        }
    }

    //MD5核心算法,供64轮
    void exchange()
    {                

      a=A;b=B;c=C;d=D;
      /**//* Round 1 */
      FF (a, b, c, d, x[ 0],  7, 0xd76aa478); /**//* 1 */
      FF (d, a, b, c, x[ 1], 12, 0xe8c7b756); /**//* 2 */
      FF (c, d, a, b, x[ 2], 17, 0x242070db); /**//* 3 */
      FF (b, c, d, a, x[ 3], 22, 0xc1bdceee); /**//* 4 */
      FF (a, b, c, d, x[ 4],  7, 0xf57c0faf); /**//* 5 */
      FF (d, a, b, c, x[ 5], 12, 0x4787c62a); /**//* 6 */
      FF (c, d, a, b, x[ 6], 17, 0xa8304613); /**//* 7 */
      FF (b, c, d, a, x[ 7], 22, 0xfd469501); /**//* 8 */
      FF (a, b, c, d, x[ 8],  7, 0x698098d8); /**//* 9 */
      FF (d, a, b, c, x[ 9], 12, 0x8b44f7af); /**//* 10 */
      FF (c, d, a, b, x[10], 17, 0xffff5bb1); /**//* 11 */
      FF (b, c, d, a, x[11], 22, 0x895cd7be); /**//* 12 */
      FF (a, b, c, d, x[12],  7, 0x6b901122); /**//* 13 */
      FF (d, a, b, c, x[13], 12, 0xfd987193); /**//* 14 */
      FF (c, d, a, b, x[14], 17, 0xa679438e); /**//* 15 */
      FF (b, c, d, a, x[15], 22, 0x49b40821); /**//* 16 */

     /**//* Round 2 */
      GG (a, b, c, d, x[ 1],  5, 0xf61e2562); /**//* 17 */
      GG (d, a, b, c, x[ 6],  9, 0xc040b340); /**//* 18 */
      GG (c, d, a, b, x[11], 14, 0x265e5a51); /**//* 19 */
      GG (b, c, d, a, x[ 0], 20, 0xe9b6c7aa); /**//* 20 */
      GG (a, b, c, d, x[ 5],  5, 0xd62f105d); /**//* 21 */
      GG (d, a, b, c, x[10],  9, 0x02441453); /**//* 22 */
      GG (c, d, a, b, x[15], 14, 0xd8a1e681); /**//* 23 */
      GG (b, c, d, a, x[ 4], 20, 0xe7d3fbc8); /**//* 24 */
      GG (a, b, c, d, x[ 9],  5, 0x21e1cde6); /**//* 25 */
      GG (d, a, b, c, x[14],  9, 0xc33707d6); /**//* 26 */
      GG (c, d, a, b, x[ 3], 14, 0xf4d50d87); /**//* 27 */
      GG (b, c, d, a, x[ 8], 20, 0x455a14ed); /**//* 28 */
      GG (a, b, c, d, x[13],  5, 0xa9e3e905); /**//* 29 */
      GG (d, a, b, c, x[ 2],  9, 0xfcefa3f8); /**//* 30 */
      GG (c, d, a, b, x[ 7], 14, 0x676f02d9); /**//* 31 */
      GG (b, c, d, a, x[12], 20, 0x8d2a4c8a); /**//* 32 */

      /**//* Round 3 */
      HH (a, b, c, d, x[ 5],  4, 0xfffa3942); /**//* 33 */
      HH (d, a, b, c, x[ 8], 11, 0x8771f681); /**//* 34 */
      HH (c, d, a, b, x[11], 16, 0x6d9d6122); /**//* 35 */
      HH (b, c, d, a, x[14], 23, 0xfde5380c); /**//* 36 */
      HH (a, b, c, d, x[ 1],  4, 0xa4beea44); /**//* 37 */
      HH (d, a, b, c, x[ 4], 11, 0x4bdecfa9); /**//* 38 */
      HH (c, d, a, b, x[ 7], 16, 0xf6bb4b60); /**//* 39 */
      HH (b, c, d, a, x[10], 23, 0xbebfbc70); /**//* 40 */
      HH (a, b, c, d, x[13],  4, 0x289b7ec6); /**//* 41 */
      HH (d, a, b, c, x[ 0], 11, 0xeaa127fa); /**//* 42 */
      HH (c, d, a, b, x[ 3], 16, 0xd4ef3085); /**//* 43 */
      HH (b, c, d, a, x[ 6], 23, 0x04881d05); /**//* 44 */
      HH (a, b, c, d, x[ 9],  4, 0xd9d4d039); /**//* 45 */
      HH (d, a, b, c, x[12], 11, 0xe6db99e5); /**//* 46 */
      HH (c, d, a, b, x[15], 16, 0x1fa27cf8); /**//* 47 */
      HH (b, c, d, a, x[ 2], 23, 0xc4ac5665); /**//* 48 */

      /**//* Round 4 */
      II (a, b, c, d, x[ 0],  6, 0xf4292244); /**//* 49 */
      II (d, a, b, c, x[ 7], 10, 0x432aff97); /**//* 50 */
      II (c, d, a, b, x[14], 15, 0xab9423a7); /**//* 51 */
      II (b, c, d, a, x[ 5], 21, 0xfc93a039); /**//* 52 */
      II (a, b, c, d, x[12],  6, 0x655b59c3); /**//* 53 */
      II (d, a, b, c, x[ 3], 10, 0x8f0ccc92); /**//* 54 */
      II (c, d, a, b, x[10], 15, 0xffeff47d); /**//* 55 */
      II (b, c, d, a, x[ 1], 21, 0x85845dd1); /**//* 56 */
      II (a, b, c, d, x[ 8],  6, 0x6fa87e4f); /**//* 57 */
      II (d, a, b, c, x[15], 10, 0xfe2ce6e0); /**//* 58 */
      II (c, d, a, b, x[ 6], 15, 0xa3014314); /**//* 59 */
      II (b, c, d, a, x[13], 21, 0x4e0811a1); /**//* 60 */
      II (a, b, c, d, x[ 4],  6, 0xf7537e82); /**//* 61 */
      II (d, a, b, c, x[11], 10, 0xbd3af235); /**//* 62 */
      II (c, d, a, b, x[ 2], 15, 0x2ad7d2bb); /**//* 63 */
      II (b, c, d, a, x[ 9], 21, 0xeb86d391); /**//* 64 */

      A += a;
      B += b;
      C += c;
      D += d;

    }

    void md5(char strDest[33], const char *strSour)
    {
        assert( (strDest!=NULL) && (strSour != NULL));
        int i;
        ChangeToFile(strSour);
        fp=fopen(FileName,"rb");
        if(fp == NULL)
        {
            printf("can't open the temp file!/n");
            exit(0);
        }
        fseek(fp, 0, SEEK_END);  //文件指针转到文件末尾
        if((len=ftell(fp))==-1)
        {
            printf("Sorry! Can not calculate files which larger than 2 GB!/n");
            fclose(fp);
            exit(0);
        }  //ftell函数返回long,最大为2GB,超出返回-1
        rewind(fp);  //文件指针复位到文件头
        A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476; //初始化链接变量
        flen[1]=len/0x20000000;     //flen单位是bit
        flen[0]=(len%0x20000000)*8;
        memset(x,0,64);   //初始化x数组为0
        fread(&x,4,16,fp);  //以4字节为一组,读取16组数据
        for(i=0;i<len/64;i++)
        {    //循环运算直至文件结束
          exchange();
          memset(x,0,64);
          fread(&x,4,16,fp);
        }
        ((char*)x)[len%64]=128;  //文件结束补1,补0操作,128二进制即10000000
        if(len%64>55)
        {
            exchange();
            memset(x,0,64);
        }
        memcpy(x+14,flen,8);    //文件末尾加入原文件的bit长度
        exchange();
        fclose(fp);
        fp=fopen(FileName,"wr");
        fprintf(fp,"%08x",PP(A));
        fprintf(fp,"%08x",PP(B));
        fprintf(fp,"%08x",PP(C));
        fprintf(fp,"%08x",PP(D));
        fclose(fp);
        fp=fopen(FileName,"r");

        for(i=0;i<32;i++)
            strDest[i]=fgetc(fp);       
       
        strDest[i]='/0';
        fclose(fp);

       
    }
  5. 协议:不是按要求做的,只能说是个人力的浪费,就不说了

相关文章推荐

使用硬盘ATA命令读取磁盘

看网上也没有什么类似的代码,这里我就发一个,下面的程序是读取硬盘的第1个扇区! #include "stdafx.h" #include #include #include #defi...
  • wrmsr
  • wrmsr
  • 2013年03月31日 22:45
  • 1606

IDE/ATA与AHCI

IDE即Integrated DriveElectronics,它的本意是指把控制器与盘体集成在一起的硬盘驱动器,我们常说的IDE接口,也叫ATA(AdvancedTechnologyAttachme...

Serial ATA (SATA) chipsets — Linux support status

本文转载于 http://linuxmafia.com/faq/Hardware/sata.html Serial ATA (SATA) chipsets — Linux suppo...
  • MM22GG
  • MM22GG
  • 2012年02月29日 23:37
  • 1289

升级XP.win7换装xp蓝屏解决 ACHI是串行ATA高级主控接口模式

ACHI是串行ATA高级主控接口模式 在日常使用中没有明显差距 但是ACHI支持NCQ技术对于IDE能有10%到20%的性能提升 而且读写 速度更快 支持热插拔 所以有需要的话 可以将IDE模式更改...
  • wyx100
  • wyx100
  • 2012年12月06日 15:09
  • 1700

Scsi命令队列转换为ata命令过程

Libata driver里用struct ata_queued_cmd结构来描述一个命令,libata driver的ata命令来自libata自身初始化和错误处理以及scsi middle...

ATA Disk在Linux中的驱动架构对比分析

这里所说的ATA Disk包含两大类:一类是传统的并行ATA(PATA),即IDE接口;另一类是目前流行的串行ATA(SATA)。对于IDE的驱动,Linux-2.6.28还进行了保留,其可以驱成传统...

MTK平台ATA测试LCM出现Not Support

一、问题描述: 使用MTK的ATA测试工具测试LCM时提示“Not Support” ATA是指:Assembly(安装) Test Assistant Tool  背景介绍: 一供L...

ata驱动框架

这里所说的ATA Disk包含两大类:一类是传统的并行ATA(PATA),即IDE接口;另一类是目前流行的串行ATA(SATA)。对于IDE的驱动,Linux-2.6.28还进行了保留,其可以驱成传统...

Write a program to pratice ATA command

ATA技术是一个关于IDE(Integrated Device Electronics)的技术规范族。最初,IDE只是一项企图把控制器与盘体集成在一起为主要意图的硬盘接口技术。 随着IDE/EIDE...

ATA和SATA等硬盘接口协议

ATA:高级技术附件( Advanced Technology Attachment )是上世纪90年代桌面机标准。它不同于SCSI(这里写链接内容)的一点是,通过它传输的数据,全部都要先进入RAM之...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ATA(代码)
举报原因:
原因补充:

(最多只允许输入30个字)