记录C++,base64解码写PDF文件遇到的坑
不得不bb一下,
场景:用户传base64数据,我生成PDF文件保存到指定路径下
背景:在前人写好的工程上增加这个功能,工程中有base64的.h, .cpp 文件,我试了base64编码没有问题,所以在用到解码的时候,我理所当然的认为解码函数也是没问题的,但是每次我写完文件,就发现文件报错损坏打不开。从来没有怀疑过解码函数,一直在测试是不是多字节问题,是不是写文件的方式不对,是不是我太笨了,呜呜呜。最终历时一段时间后,搞定了这个简单的功能,原来是base64解码函数的问题。噗~
base64解码函数:
std::string base64_Decode(const char* Data, int DataByte, int& OutByte)
{
const char DecodeTable[] =
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
62, // '+'
0, 0, 0,
63, // '/'
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // '0'-'9'
0, 0, 0, 0, 0, 0, 0,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // 'A'-'Z'
0, 0, 0, 0, 0, 0,
26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // 'a'-'z'
};
// ох
std::string strDecode;
int nValue;
int i = 0;
while (i < DataByte)
{
if (*Data != '\r' && *Data != '\n')
{
nValue = DecodeTable[*Data++] << 18;
nValue += DecodeTable[*Data++] << 12;
strDecode += (nValue & 0x00FF0000) >> 16;
OutByte++;
if (*Data != '=')
{
nValue += DecodeTable[*Data++] << 6;
strDecode += (nValue & 0x0000FF00) >> 8;
OutByte++;
if (*Data != '=')
{
nValue += DecodeTable[*Data++];
strDecode += nValue & 0x000000FF;
OutByte++;
}
}
i += 4;
}
else
{
Data++;
i++;
}
}
return strDecode;
}
传base64解码写文件函数:
void CZZUser::hidBaseToFile(const char* baseData, const char* filePath)
{
// base64 转 文件 // 解码
int resbase64 = 0;
std::string fileData = base64_Decode(baseData, strlen(baseData), resbase64); // 写文件
FILE *f = fopen(filePath, "wb");
fwrite(fileData.c_str(), resbase64, 1, f);
fclose(f); }
记录C++,base64解码写PDF文件遇到的坑的更多相关文章
- .NET平台开源项目速览(16)C#写PDF文件类库PDF File Writer介绍
		
1年前,我在文章:这些.NET开源项目你知道吗?.NET平台开源文档与报表处理组件集合(三)中(第9个项目),给大家推荐了一个开源免费的PDF读写组件 PDFSharp,PDFSharp我2年前就看过 ...
 - C#写PDF文件类库PDF File Writer介绍
		
.NET平台开源项目速览(16)C#写PDF文件类库PDF File Writer介绍 阅读目录 1.PDF File Writer基本介绍 2.一个简单的使用案例 3.资源 1年前,我在文章:这 ...
 - 写pdf文件
		
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
 - base64编码后的pdf文件前端页面展示--pdf.js的应用
		
最近在整理项目中用到的插件或者使用心得,感觉还是写成博客,能加深新一层的理解. 我先说一下我的需求:由于java后台编译的文件流在手机端加载速度太慢,所以想着可以在前端解析,放在页面展示给用户. 所以 ...
 - Kotlin/Java Base64编码和解码(图片、文件)
		
原文: Kotlin/Java Base64编码和解码(图片.文件) | Stars-One的杂货小窝 最近在项目中使用到了Base64编码和解码,便是稍微写篇文章记录一下 PS:本文代码都是使用Ko ...
 - iText C# 合并PDF文件流,以及A5变A4时内容默认放在最底下的问题的解决方法;ASP.NET 实现Base64文件流下载PDF
		
/// <summary> 合併PDF檔(集合) </summary> /// <param name="files">欲合併PDF檔之集合(一 ...
 - 将图片文件转化为字节数组字符串,并对其进行Base64编码处理,以及对字节数组字符串进行Base64解码并生成图片
		
实际开发中涉及图片上传并且量比较大的时候一般处理方式有三种 1.直接保存到项目中 最老土直接方法,也是最不适用的方法,量大对后期部署很不方便 2.直接保存到指定路径的服务器上.需要时候在获取,这种方式 ...
 - 使用java的 htpUrlConnection post请求 下载pdf文件,然后输出到页面进行预览和下载
		
使用java的 htpUrlConnection post请求 下载pdf文件,然后输出到页面进行预览和下载 2018年06月07日 10:42:26 守望dfdfdf 阅读数:235 标签: jav ...
 - 利用base64函数,对文件进行转码加密
		
设计此种编码是为了使二进制数据可以通过非纯 8-bit 的传输层传输,例如电子邮件的内容就是通过base64转码后传输的.Base64-encoded后, 数据要比原始数据多占用 33% 左右的空间. ...
 - pdf文件的导入导出
		
下面的代码自己本人没有尝试过,只是用来做记录,用到时候再说! 最近碰见个需求需要实现导出pdf文件,上网查了下代码资料总结了以下代码.可以成功的实现导出pdf文件. 在编码前需要在网上下载个itext ...
 
随机推荐
- Golang标准库之bytes介绍
			
本次主要介绍golang中的标准库bytes,基本上参考了 字节 | bytes .Golang标准库--bytes 文章. bytes库主要包含 5 大部分,即: 常量 变量 函数 Buffer R ...
 - 我的第一个项目(十五) :完成数据保存功能(后端,改update)
			
好家伙, 代码已开源(Gitee) PH-planewar: 个人开发的全栈小游戏 前端:vue2 + element-ui 后端: Springboot + mybatis-plus 数据库: ...
 - C++  //常用查找算法  find  //自定义类型需要重载 ==
			
1 //常用查找算法 find 2 #include<iostream> 3 #include<algorithm> 4 #include<functional> ...
 - Java对象引用和内存管理的细节
			
在Java中,当局部变量(比如方法参数)的作用域结束时,这个局部变量的引用确实不再存在,但这并不意味着它引用的对象会被销毁.对象的销毁是由Java的垃圾回收器(Garbage Collector, G ...
 - 字典嵌套列表 与 列表嵌套字典 导出为csv 的方法
			
字典嵌套列表 导出csv {'rank': ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '1 ...
 - read_csv报错Initializing from file failed ,pandas.read_csv不能读取中文内容报错‘utf-8‘ codec can‘t decode byte
			
import pandas as pd f=open("C:/Users/qa124/Desktop/北京地区信息.csv",encoding='utf-8') myfile=pd ...
 - Redis稳定性之战:AOF日志支撑数据持久化
			
★ Redis24篇集合 1 介绍 AOF(Append Only File)持久化:以独立日志的方式存储了 Redis 服务器的顺序指令序列,并只记录对内存进行修改的指令. 当Redis服务发生雪崩 ...
 - 29_SDL多线程与锁机制
			
目录 一.简介 二.代码实现: 2.1.声明 2.2.创建锁.消费者 2.3.销毁 2.4.实现生产者逻辑 2.5.实现销毁者逻辑 2.6.创建生产者 三.分装SDL锁机制 condmutex.h c ...
 - 前后端分离Ajax入门
			
前后端分离之Ajax入门 一.概念 Ajax(Asynchronous Javascript And XML),即是异步的JavaScript和XML,Ajax其实就是浏览器与服务器之间的一种异步通信 ...
 - VR汽车虚拟仿真的实现、应用和未来
			
汽车虚拟仿真技术是一种利用计算机模拟汽车运行的技术,以实现对汽车行为的分析.评估和改进.汽车虚拟仿真技术是汽车工业中重要的开发设计和测试工具,可以大大缩短产品研发周期.降低研发成本和提高产品质量.本文 ...