前段时间翻了翻以前收集的一些文档,看见了这个东西,于是想写个类封装一下.

这个东西在电子邮件中用的比较多,详细的情况自己搜索一下吧.

头文件部分:

/**//*--------------------------------------------------------------------------------*/


//定义一些额外的信息,保存这些信息到文件中可以用winrar打开
#define BEGIN_FLAG           "begin "
#define END_FLAG             "' end"
#define DEFAULT_ID           "777"
#define DEFAULT_FILE_NAME    "UueEncodeFile.txt"
enum UueOutMode ...{out_str,out_file};

class CUuencode
...{
public:
    CUuencode(/**//*UueOutMode Mode*/);
    void SetFileModeInf(unsigned char* filename=(unsigned char*)DEFAULT_FILE_NAME,unsigned char* ID=(unsigned char*)DEFAULT_ID);
public:
    ~CUuencode(void);
public:
    void unUueChar (unsigned char chuue[4],unsigned char chasc[3]);
    void UueChar   (unsigned char chasc[3],unsigned char chuue[4]);
    DWORD UueStr (const unsigned char ascstr[],size_t asclen,unsigned char uuestr[],size_t &uuelen,UueOutMode mode=out_str);
    size_t GetUueStrDataLen(const unsigned char uuestr[]);
    DWORD UnUueStr(const unsigned char uuestr[],size_t uuelen,unsigned char ascstr[],size_t &asclen,UueOutMode &mode);
private:
    UueOutMode FMode;
    unsigned char *  FID;
    unsigned char *  FileName;
    size_t     IDlen;
    size_t     namelen;
    unsigned char * beginFlag;
    unsigned char * endFlag;
};

解码的那部分未贴出来,因为当输入的字符为非uue编码时有可能会溢出,打算先考虑一下如何判断输入的为非UUE编码,或者错误的编码.

实现:

/**//*------------------------------------------------*
 *                                                  *
 *                 Uue字符编码                    *
 *                 2007-3-16                      *
 *                                                  *
*------------------------------------------------*/

CUuencode::CUuencode(/**//*UueOutMode Mode=out_str*/)
...{
    beginFlag=(unsigned char*)BEGIN_FLAG;
    endFlag=  (unsigned char*)END_FLAG;
}
void CUuencode::SetFileModeInf(unsigned char* filename,unsigned char* ID)
...{
    
    FID=ID;
    FileName=filename;
    IDlen=_mbslen(FID);
    namelen=_mbslen(filename);
    if(IDlen==0)
    ...{
        _mbscpy(FID,(unsigned char*)DEFAULT_ID);
        IDlen=_mbslen(FID);
    }
    if(namelen==0)
    ...{
        _mbscpy(FileName,(unsigned char*)DEFAULT_ID);
        namelen=_mbslen((unsigned char*)DEFAULT_FILE_NAME);
    }
}
CUuencode::~CUuencode()
...{
    //
}
/**//*Uuencode编码*/
/**//*
chasc:未编码的二进制代码
chuue:编码过的Uue代码
*/
void CUuencode::UueChar(unsigned char chasc[3],unsigned char chuue[4])
...{
    int i,k=2;
    unsigned char t=NULL;
    for(i=0;i<3;i++)
    ...{
        *(chuue+i)=*(chasc+i)>>k;
        *(chuue+i)|=t;
        if(*(chuue+i)==NULL) 
            *(chuue+i)+=96;
        else 
            *(chuue+i)+=32;
        t=*(chasc+i)<<(8-k);
        t>>=2;
        k+=2;
    }
    *(chuue+3)=*(chasc+2)&63;
    if(*(chuue+3)==NULL) 
        *(chuue+3)+=96;
    else 
        *(chuue+3)+=32;


/**//*Uuencode解码*/
/**//*
chuue:未解码的Uue代码
chasc:解码过的二进制代码
*/
void CUuencode::unUueChar(unsigned char chuue[4],unsigned char chasc[3])
...{
    int i,k=2;
    unsigned char t=NULL;
    if(*chuue==96) 
        *chuue=NULL;
    else 
        *chuue-=32;
    for(i=0;i<3;i++)
    ...{
        *(chasc+i)=*(chuue+i)<<k;
        k+=2;
        if(*(chuue+i+1)==96) *(chuue+i+1)=NULL;
        else *(chuue+i+1)-=32;
        t=*(chuue+i+1)>>8-k;
        *(chasc+i)|=t;
    }


//编码一个ASC串为Uue串,先传入NULL到uuestr,返回uuelen,未包含'
DWORD  CUuencode::UueStr(const unsigned char ascstr[],size_t asclen,unsigned char uuestr[],size_t &uuelen,UueOutMode mode)
...{
    size_t asclen_3=asclen+((asclen%3)?(3-(asclen%3)):0); 
    size_t require=asclen_3;
    if(uuestr==NULL)
    ...{
        
        if(mode==out_str)
            /**//*    |----DATA---|---------Line Header +' '-------|*/
        ...{    
            uuelen= require*4/3+(asclen/45)*2+((asclen%45)?1:0)*2;
            return 0;
        }

        else
        ...{
            /**//*    |----DATA---|---------Line Header +' '-------|---"BEGIN "----|------|-' '-|-------|-'/n'-|---"' END"---*/
            uuelen= require*4/3+(asclen/45)*2+((asclen%45)?1:0)*2+_mbslen(beginFlag)+IDlen+  1  +namelen+ 1    +_mbslen(endFlag);
            return 0;
        }
        
    }
    unsigned char *temp=new unsigned char[asclen_3];
    //memory alloc fail
    if(temp==NULL) return GetLastError();
    unsigned char *pdel=temp;
    unsigned char *puue=uuestr;
    memset(temp,0,asclen_3);
    memcpy(temp,ascstr,asclen);
    if(mode==out_file)
    ...{
        _mbscpy(uuestr,beginFlag);
        uuestr+=_mbslen(beginFlag);
        _mbscpy(uuestr,FID);
        uuestr+=IDlen;
        *uuestr++=' ';
        _mbscpy(uuestr,FileName);
        uuestr+=namelen;
        
        *uuestr++=' ';
    }
    for(size_t i=0;i<asclen_3;)
    ...{
        if(0==i%45)
            *uuestr++=0x20+((asclen_3-i>=45)?45:(asclen_3-i));
        UueChar(temp,uuestr);
        temp+=3;
        uuestr+=4;
        if(!((i+3)%45))
        ...{
            *uuestr++=' ';
        }
        i+=3;
    }
    *uuestr++=' ';
    if(mode==out_file)
    ...{
        _mbscpy(uuestr,endFlag);

    }
    //*uuestr='

写了一个UUE编码的类.相关推荐

  1. 自己用的框架写了一个PHP模版解析类

    <?php if(!defined('IS_HEARTPHP')) exit('Access Denied'); /** * template.class.php 模板解析类 * * @copy ...

  2. java五子棋的算法_初学java,写了一个五子棋算法的类,请大家多多指教.

    //五子棋算法类, /*看了一下QQ上面五子棋,直到有五子连珠才给出谁胜 *俺也这么做 *开始分析,先只考虑实现,不考虑效益,然后再对算法进行优化 *========================= ...

  3. 用C#写的一个注册表操作类

    该类实现了注册表读取.写入.删除.查找等功能. 实现代码: using System; using System.Collections.Generic; using System.Linq; usi ...

  4. B编码与BT种子文件分析,以及模仿json-cpp写一个B编码解析器

    B编码与BT种子文件分析,以及模仿json-cpp写一个B编码解析器 1.什么是B编码 2.B编码格式 3.种子文件结构 3.1.主文件结构 3.2.info结构 4.简单的例子了解一下种子文件和B编 ...

  5. setpagecache.php_一个PHP页面缓存类 修改后可作Emlog缓存插件

    最近,细细看了许多关于缓存的文章,有程序级的.非程序级的.内存缓存.文件缓存等等,感觉获益良多,于是为巩固知识,强化记忆,自己也多动动手去写写关于缓存面的程序. 这是自己写的一个PHP文件缓存类,此类 ...

  6. 一个 VBS 写的 Base64 + UUE 编码程序源码,可自定义编码表

    以下内容仅作为 http://topic.csdn.net/u/20090707/00/0b3b4c31-8cef-4bd2-817e-4a2a445e8b87.html?seed=178767877 ...

  7. 利用反射自己写的一个ModelHelper类

    开发中 很多人都会使用BLL Model这种开发,我也是,虽然现在有很多的自动生成工具,能在几秒内生成cs的模板,但我个人还不是很喜欢,我还是喜欢自己一个一个去写,这样更能了解自己的代码. 不过手动编 ...

  8. java写一个外网访问的接口_【JAVA基础】一个案例搞懂类、对象、重载、封装、继承、多态、覆盖、抽象和接口概念及区别(中篇)...

    0 前言 初学JAVA时,总会对一些概念一知半解,相互混淆,不明其设计的用意,如类.对象.重载.封装.继承.多态.覆盖.抽象类.接口概念.为便于理解和巩固,本文将基于一个案例及其变形,展现各个概念的定 ...

  9. 无聊写的一个PHP Socket类

    无聊写的一个PHP Socket类,功能还比较简单,不完善. <?php /** *//***      * @project:socket类      * @license:GPL       ...

最新文章

  1. ESXI使用记录---安装vSphere(VCSA)
  2. .NET中可空值类型实现原理
  3. @SuppressWarnings注解用法
  4. html hover图片效果,CSS第9款:Imagehover.css 纯CSS打造的图片悬停效果
  5. 记录一下LabelImg实际绘制框颜色的位置
  6. 《leetcode》longest-substring-without-repeating
  7. 牛客网 【每日一题】7月24日题目精讲—小A的柱状图
  8. Go设计模式之Factory
  9. 根据模板提示,加入元素,修改CSS
  10. 更快更强!华为大数据新版本让Hive提速50%!
  11. 古典密码(单表密码,维吉尼亚密码,普莱费尔密码,一次一密)
  12. Java-PTA 无聊的小明来数1
  13. Numpy中的数组、行/列向量及其之间的转化
  14. 智能家居平台软件测试,智能家居 | 智能家居管理系统测试具体都有哪些流程?...
  15. 题目:学生成绩管理系统设计(C语言程序设计期末作业)
  16. Delphi多线程编程基础入门
  17. 李子的猜数游戏!!!!!!!!!!!!!!!!(δ版)
  18. 【三】傅里叶变换——1
  19. 【直播回顾】阿里高级开发工程师红文:领域驱动设计实战--如何应对复杂业务...
  20. 员工满意度调查问卷----团队管理应该关注员工的这些事宜

热门文章

  1. u盘损坏无法读取怎么恢复数据?
  2. 浙江省机电工程师职称评审条件及流程
  3. 华为OD机试 - 考古学家(Python)| 代码编写思路+核心知识点
  4. [YOLOv7]基于YOLOv7的食物卡路里检测系统(源码&部署教程&数据集)
  5. simulink仿真 短路分析 含三相直流逆差的电力系统三相短路仿真,程序完整
  6. python爬取饿了么外卖商家数据_用python抓取饿了么无证店铺
  7. 外贸人SOHO怎么收汇?2020最新外贸B2B收款结汇方法详解!
  8. RKE部署Kubernetes集群
  9. SQL查询日志 查看数据库历史查询记录的方法
  10. 小米笔记本指纹识别失效解决方法