编码转换工具_PDF在线转换工具

编码转换工具_PDF在线转换工具核心代码:1voidEncodeBase64(unsignedchar*ce,unsignedchar*co)2{3unsignedchar*p;4unsignedi

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

编码转换工具_PDF在线转换工具

核心代码:

  1 void EncodeBase64(unsigned char *ce, unsigned char *co)
  2 {
  3     unsigned char *p;
  4     unsigned int ocl; // 原串长度
  5     unsigned int ecl; // 加密后长度
  6     unsigned int t;   // ocl 除以 3 后的余数
  7     unsigned char *oend;
  8     unsigned char *eend;
  9     unsigned char *p1, *p2, *p3;
 10     unsigned char *pe;
 11     unsigned char Base64Table[68] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
 12 
 13     for (p = co, ocl = 0; *p; ++p)
 14     {
 15         ++ocl;
 16     }
 17 
 18     ecl = ocl / 3 * 4; // 不用补0的部分
 19     t = ocl % 3;
 20     if (t)
 21         ecl += 4;      // 末尾4字节
 22 
 23     oend = co + ocl;
 24     eend = ce + ecl;
 25     *eend = '\0';
 26 
 27     p1 = co;
 28     p2 = co + 1;
 29     p3 = co + 2;
 30     pe = ce;
 31     while (p3 < oend) // 不用补0的部分
 32     {
 33         *pe++ = *p1 >> 2;
 34         *pe++ = (*p1 & 0x03) << 4 | *p2 >> 4;
 35         *pe++ = (*p2 & 0x0F) << 2 | *p3 >> 6;
 36         *pe++ = *p3 & 0x3F;
 37 
 38         p1 += 3;
 39         p2 += 3;
 40         p3 += 3;
 41     }
 42 
 43 
 44     /*
 45     末尾4字节
 46     t = 1:
 47     [1101 0101]
 48     00[110101] 00[010000] 40H pad    40H pad
 49     35H        10H        40H pad    40H pad
 50     31H '1'    51H 'Q'    3DH '='    3DH '='
 51 
 52     t = 2:
 53     [1101 0101] [1100 0101]
 54     00[110101] 00[011100] 00[010100] 40H pad
 55     35H        1CH        14H        40H pad
 56     31H '1'    62H 'c'    55H 'U'    3DH '='
 57     */
 58     switch (t)
 59     {
 60     case 1:
 61         *pe++ = *p1 >> 2;
 62         *pe++ = (*p1 & 0x03) << 4;
 63         *pe++ = 0x40;
 64         *pe = 0x40;
 65         break;
 66 
 67     case 2:
 68         *pe++ = *p1 >> 2;
 69         *pe++ = (*p1 & 0x03) << 4 | *p2 >> 4;
 70         *pe++ = (*p2 & 0x0F) << 2;
 71         *pe = 0x40;
 72         break;
 73 
 74     default:
 75         break;
 76     }
 77 
 78     // 已创建好索引值,开始转换
 79 
 80     /*
 81     Base 64 加密索引表
 82     一一对应关系,解密就是反过来
 83 
 84     000 ~ 025   026 ~ 051   052 ~ 061   062   063   064
 85     00H ~ 19H   1AH ~ 33H   34H ~ 3DH   3EH   3FH   40H
 86         ↓           ↓           ↓        ↓     ↓     ↓
 87     41H ~ 5AH   61H ~ 7AH   30H ~ 39H   2BH   2FH   3DH
 88     'A' ~ 'Z'   'a' ~ 'z'   '0' ~ '9'   '+'   '/'   '='
 89 
 90     for (p = ce; p < eend; ++p)
 91     {
 92         if (*p <= 0x19)
 93             *p += 0x41;
 94         else if (*p >= 0x1A && *p <= 0x33)
 95             *p += 0x61 - 0x1A;
 96         else if (*p >= 0x34 && *p <= 0x3D)
 97             *p -= 0x04;
 98         else if (*p == 0x3E)
 99             *p = 0x2B; // '+'
100         else if (*p == 0x3F)
101             *p = 0x2F; // '/'
102         else if (*p == 0x40)
103             *p = 0x3D; // '='
104     }
105     */
106     /*
107     查表法使用额外空间,减少代码长度,不再需要if判断分支
108     */
109     for (p = ce; p < eend; ++p)
110     {
111         *p = Base64Table[*p];
112     }
113 }
114 void DecodeBase64(unsigned char *co, unsigned char *ce)
115 {
116     unsigned char *p;
117     unsigned int ocl; // 原串长度
118     unsigned int ecl; // 加密串长度
119     unsigned int t;   // '='个数
120 
121     unsigned char *oend;
122     unsigned char *eend;
123     unsigned char *eendf; // 加密串中每4个字节计算,不含'='的部分的末尾
124     unsigned char *p1, *p2, *p3, *p4;
125     unsigned char *po;
126 
127     for (p = ce, ecl = 0; *p; ++p)
128     {
129         ++ecl;
130     }
131 
132     eendf = eend = ce + ecl;
133     for (t = 0, p = eend - 1; *p == '='; --p)
134     {
135         ++t;
136     }
137 
138     if (t)
139         eendf -= 4;
140 
141     ocl = ecl / 4 * 3 - t; // 合法加密串长度总是4的倍数,函数不做合法性检查
142     oend = co + ocl;
143     *oend = '\0';
144 
145     /*
146     还原为索引
147 
148     41H ~ 5AH   61H ~ 7AH   30H ~ 39H   2BH   2FH   3DH
149     'A' ~ 'Z'   'a' ~ 'z'   '0' ~ '9'   '+'   '/'   '='
150         ↓           ↓           ↓        ↓     ↓     ↓
151     00H ~ 19H   1AH ~ 33H   34H ~ 3DH   3EH   3FH   40H
152     */
153     for (p = ce; p < eend; ++p)
154     {
155         if (*p >= 'A' && *p <= 'Z')
156             *p -= 0x41;
157         else if (*p >= 'a' && *p <= 'z')
158             *p -= 0x61 - 0x1A;
159         else if (*p >= '0' && *p <= '9')
160             *p += 0x04;
161         else if (*p == '+')
162             *p = 0x3E;
163         else if (*p == '/')
164             *p = 0x3F;
165         else if (*p == '=')
166             *p = 0x40;
167     }
168 
169     // 合并字节
170     p1 = ce;
171     p2 = ce + 1;
172     p3 = ce + 2;
173     p4 = ce + 3;
174     po = co;
175     while (p1 < eendf)
176     {
177         *po++ = *p1 << 2 | *p2 >> 4;
178         *po++ = *p2 << 4 | *p3 >> 2;
179         *po++ = *p3 << 6 | *p4;
180 
181         p1 += 4;
182         p2 += 4;
183         p3 += 4;
184         p4 += 4;
185     }
186     /*
187     while (p1 < eendf)
188     {
189         *po++ = *p1 << 2 | (*p2 & 0x30) >> 4;
190         *po++ = *p2 << 4 | (*p3 & 0x3C) >> 2;
191         *po++ = *p3 << 6 | *p4 & 0x3F;
192 
193         p1 += 4;
194         p2 += 4;
195         p3 += 4;
196         p4 += 4;
197     }
198     */
199     /*
200     末尾4字节
201 
202     t = 1:
203     31H '1'    62H 'c'    55H 'U'    3DH '='
204     35H        1CH        14H        40H pad
205     00[110101] 00[011100] 00[010100] 40H pad
206     [1101 0101] [1100 0101]
207 
208     t = 2:
209     31H '1'    51H 'Q'    3DH '='    3DH '='
210     35H        10H        40H pad    40H pad
211     00[110101] 00[010000] 40H pad    40H pad
212     [1101 0101]
213     */
214     switch (t)
215     {
216     case 1:
217         *po++ = *p1 << 2 | *p2 >> 4;
218         *po = *p2 << 4 | *p3 >> 2;
219         break;
220 
221     case 2:
222         *po = *p1 << 2 | *p2 >> 4;
223         break;
224 
225     default:
226         break;
227     }
228 }
229 int DecodeBase64_safe(unsigned char *co, unsigned char *ce)
230 {
231     if (!IsBase64String(ce))
232         return 0;
233     else
234     {
235         DecodeBase64(co, ce);
236         return 1;
237     }
238 }

完整源码

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/166444.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 微信小程序能跳转到外部链接吗(小程序跳转第三方网页)

    个人类型和海外类型的小程序不支持web-view标签也就是说个人申请的小程序,就别想跳转了!!!!1.开发的时候,我们难免碰到要跳转到其他网页中去那该怎么实现呢?2.例如我想点击一个按钮,跳转到百度(百度的网页还是在小程序中打开)3.wxml1.index.wxml(按钮页面)&lt;viewclass=’wrapper’&gt;&lt;b…

  • 时滞模型的matlab编程_如何用matlab仿真

    时滞模型的matlab编程_如何用matlab仿真Matlab仿真含时滞多智体一致性分析,附代码Matlab仿真含时滞多智体一致性分析,附代码Matlab仿真含时滞多智体一致性分析,附代码系统结构如下图所示:clear;clc;%2014_多智能体网络的一致性问题研究_纪良浩%此为Paper中的示例代码%例2.1:A=[0,0,0.1,0,0;0.1,0,0,0,0;0,0.15,0,0…

  • RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->WinForm版本新增新的用户权限设置界面效率更高、更规范…

    RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->WinForm版本新增新的用户权限设置界面效率更高、更规范…

  • spi总线协议及spi时序图详解_奔创spi

    spi总线协议及spi时序图详解_奔创spi大家好,我是无际。上个章节我们讲解了spi接口定义,今天我们更加深入讲解下spi协议时序图和spi四种模式的用法。刚开始接触单片机开发时,最怕就是看时序图,对于我来说就是奇怪的知识。特别是SPI和IIC的,以前写程序都直接复制别人程序,功能实现就行了也没去研究过数据传输的时候时序具体是怎么样的。那个时候经验也不足,网上搜的资料说的都太学术化了,也看不懂。后面项目做多了,发现最常用到的通信总线无非就是SPI、IIC、USART、CAN、单口通信。理解也慢慢深刻了,现在去分析时序图也更加

  • tcp工作原理三次握手_tcp三次握手为什么不是两次

    tcp工作原理三次握手_tcp三次握手为什么不是两次目录一、TCP协议二、TCP原理1,确认应答机制2,超时重传机制3,连接管理机制4,滑动窗口5,流量控制6,拥塞控制7,延迟应答8,捎带应答9,粘包问题一、TCP协议TCP,即TransmissionControlProtocol,传输控制协议。人如其名,要对数据的传输进行一个详细的控制。TCP协议段格式源/目的端口号:表示数据是从哪个进程来,到哪个进程去;序列号:在建立连接时由计算机生成的随机数作为其初始值,通过

  • 解决Oracle数据库1521端口telnet不通问题

    解决Oracle数据库1521端口telnet不通问题现象:服务器的ip地址可以ping通,但是安装oracle过程中的指定的“1521”端口telnet不通过解决办法:1、确保防火墙对1521端口开启; 2、修改oracle安装之后的文件tnsnames.ora(F:\install\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora)中“HOST”的值为”计算机全名“(桌面属性\高级

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号