quoted-printable编码解码函数测试[分享]_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 4362 | 回复: 0   主题: quoted-printable编码解码函数测试[分享]        下一篇 
jfl
注册用户
等级:少校
经验:1112
发帖:95
精华:0
注册:2012-8-10
状态:离线
发送短消息息给jfl 加好友    发送短消息息给jfl 发消息
发表于: IP:您无权察看 2012-8-29 15:13:15 | [全部帖] [楼主帖] 楼主

代码:

#include "stdafx.h"
#include <Windows.h>
#include <tchar.h>

#define MAX_SIZE 512

int EncodeQuoted(const unsigned char* pSrc, char* pDst, int nSrcLen, int nMaxLineLen);
int DecodeQuoted(const char* pSrc, unsigned char* pDst, int nSrcLen);

int _tmain(int argc, TCHAR *argv[])
{
       //MessageBox(NULL, L"a", L"a", MB_OK);
       BOOL bAction;
      // TCHAR tFileName = TEXT("a.txt");
      // TCHAR tWriteFile = "b.txt";
       char *pcBuffer = new char[MAX_SIZE];
       unsigned char *pDst = new unsigned char[MAX_SIZE];
       DWORD dwNumBytes = 0;
       DWORD dwFileSize = 0;
       HANDLE hFile = CreateFile(argv[1], GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
       if(hFile == INVALID_HANDLE_VALUE)
       {
             printf("file create error (error %d)\n", GetLastError());
             delete pcBuffer;
             delete pDst;
             pcBuffer = NULL;
             pDst = NULL;
             return 0;
       }
      // GetFileSize(hFile, &dwFileSize);
       bAction = ReadFile(hFile, pcBuffer, MAX_SIZE, &dwNumBytes, NULL);
       //printf("bAction is %d\n", bAction);
       if(!bAction)
       {
             printf("file read error(error %d)\n", GetLastError());
             delete pcBuffer;
             delete pDst;
             pDst = NULL;
             pcBuffer = NULL;
             CloseHandle(hFile);
             return 0;
       }
       dwFileSize = DecodeQuoted(pcBuffer, pDst, dwNumBytes);
       if(dwFileSize <= 0)
       {
             printf("dwFileSize is 0\n");
             return 0;
       }
       dwNumBytes = 0;
       delete pcBuffer;
       pcBuffer = NULL;
       CloseHandle(hFile);
       HANDLE hWriteFile = CreateFile(argv[2], GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL);
       if(hWriteFile == INVALID_HANDLE_VALUE)
       {
             printf("write file create error(error %d)\n", GetLastError());
             delete pDst;
             pDst = NULL;
             return 0;
       }
       bAction = WriteFile(hWriteFile, pDst, dwFileSize, &dwNumBytes, NULL);
       /*if(!bAction)
       {*/
             printf("write file write error(error %d)\n", GetLastError());
             delete pDst;
             pDst = NULL;
             CloseHandle(hWriteFile);
             return 0;
       //}
       //return 0;
}

int EncodeQuoted(const unsigned char* pSrc, char* pDst, int nSrcLen, int nMaxLineLen)
{
       int nDstLen; // 输出的字符计数
       int nLineLen; // 输出的行长度计数
       nDstLen = 0;
       nLineLen = 0;

       for (int i = 0; i < nSrcLen; i++, pSrc++)
       {
             // ASCII 33-60, 62-126原样输出,其余的需编码
             if ((*pSrc >= '!') && (*pSrc <= '~') && (*pSrc != '='))
             {
                   *pDst++ = (char)*pSrc;
                   nDstLen++;
                   nLineLen++;
             }
             else
             {
                   sprintf_s(pDst, MAX_SIZE, "=%02X", *pSrc);
                   pDst += 3;
                   nDstLen += 3;
                   nLineLen += 3;
             }
             // 输出换行?
             if (nLineLen >= nMaxLineLen - 3)
             {
                   sprintf_s(pDst, MAX_SIZE, "=\r\n");
                   pDst += 3;
                   nDstLen += 3;
                   nLineLen = 0;
             }
       }
       // 输出加个结束符
       *pDst = '\0';
       return nDstLen;
}

//Quoted-Printable解码很简单,将编码过程反过来就行了。 
int DecodeQuoted(const char* pSrc, unsigned char* pDst, int nSrcLen)
{
       int nDstLen; // 输出的字符计数
       int i;
       i = 0;
       nDstLen = 0;
       while (i < nSrcLen)
       {
             if (strncmp(pSrc, "=\r\n", 3) == 0) // 软回车,跳过
             {
                   pSrc += 3;
                   i += 3;
             }
             else
             {
                   if (*pSrc == '=') // 是编码字节
                   {
                         sscanf_s(pSrc, "=%02X", pDst);
                         pDst++;
                         pSrc += 3;
                         i += 3;
                   }
                   else // 非编码字节
                   {
                         *pDst++ = (unsigned char)*pSrc++;
                         i++;
                   }
                   nDstLen++;
             }
       }
       // 输出加个结束符
      // *pDst = '\0';
       return nDstLen;




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论