package com.changyou.ims.mobile.util; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; /** * Base64编码工具类 */ public class CustomBase64 { private static final char[] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-".toCharArray(); public static String encode(byte[] data) { int start = 0; int len = data.length; StringBuffer buf = new StringBuffer(data.length * 3 / 2); int end = len - 3; int i = start; int n = 0; while (i <= end) { int d = ((((int) data[i]) & 0x0ff) << 16) | ((((int) data[i + 1]) & 0x0ff) << 8) | (((int) data[i + 2]) & 0x0ff); buf.append(legalChars[(d >> 18) & 63]); buf.append(legalChars[(d >> 12) & 63]); buf.append(legalChars[(d >> 6) & 63]); buf.append(legalChars[d & 63]); i += 3; if (n++ >= 14) { n = 0; buf.append(""); } } if (i == start + len - 2) { int d = ((((int) data[i]) & 0x0ff) << 16) | ((((int) data[i + 1]) & 255) << 8); buf.append(legalChars[(d >> 18) & 63]); buf.append(legalChars[(d >> 12) & 63]); buf.append(legalChars[(d >> 6) & 63]); buf.append("="); } else if (i == start + len - 1) { int d = (((int) data[i]) & 0x0ff) << 16; buf.append(legalChars[(d >> 18) & 63]); buf.append(legalChars[(d >> 12) & 63]); buf.append("=="); } return buf.toString(); } private static int decode(char c) { if (c >= 'A' && c <= 'Z') return ((int) c) - 65; else if (c >= 'a' && c <= 'z') return ((int) c) - 97 + 26; else if (c >= '0' && c <= '9') return ((int) c) - 48 + 26 + 26; else switch (c) { case '+': return 62; case '-': return 63; case '=': return 0; default: throw new RuntimeException("unexpected code: " + c); } } /** * Decodes the given Base64 encoded String to a new byte array. The byte array holding the decoded data is returned. */ public static byte[] decode(String s) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { decode(s, bos); } catch (IOException e) { throw new RuntimeException(); } byte[] decodedBytes = bos.toByteArray(); try { bos.close(); bos = null; } catch (IOException ex) { System.err.println("Error while decoding BASE64: " + ex.toString()); } return decodedBytes; } private static void decode(String s, OutputStream os) throws IOException { int i = 0; int len = s.length(); while (true) { while (i < len && s.charAt(i) <= ' ') i++; if (i == len) break; int tri = (decode(s.charAt(i)) << 18) + (decode(s.charAt(i + 1)) << 12) + (decode(s.charAt(i + 2)) << 6) + (decode(s.charAt(i + 3))); os.write((tri >> 16) & 255); if (s.charAt(i + 2) == '=') break; os.write((tri >> 8) & 255); if (s.charAt(i + 3) == '=') break; os.write(tri & 255); i += 4; } } }
首先感谢网友的分享,原帖地址:
http://www.eoeandroid.com/thread-237997-1-1.html
拿到自己项目里本来挺好用的,但是在安卓客户端和服务器端通信的时候出错了,看了下原因,是因为加密后的字符串里有“/”和空格,本来想放弃这个方法来着,或者取巧一下把这两个字符替换掉,后来想想还是想追查下原因,结果在原作者自己定义的base64类里看到了端倪,稍作修改后,没有问题了!
这里就不附加密解密的方法了,大家如果需要可以去上面的链接看,我只把修改后的base64类发一下吧!
相关推荐
内容概要:本文档阐述了 Python 爬虫的基本概念,详细讲解了构建一个简单有效的爬虫所需的五个关键步骤——确定目标、发送请求、解析内容、提取数据和保存结果,并附带了每个阶段相应的实例代码段帮助理解和实施。此外,文中强调了在网络爬虫过程中必须考虑的因素,如遵纪守法,确保不会干扰到网站正常运作或是违反站点设定的规定;以及提供了实用建议以保障高效而不失礼貌地收集所需信息。最后,文档提及Python爬虫主要应用场景包括但不限于数据挖掘、市场调研以及竞争情报搜集等方面。 适用人群:对于有兴趣了解或深入研究Web Scraping的学生、开发者和技术爱好者。 使用场景及目标:无论是初学者希望获得有关Python编程的第一手经验,还是已经有一定经验的技术工作者打算提高效率解决实际问题都非常合适。 其他说明:本文不仅介绍了基础概念与常用方法论,而且给出了完整的学习路径指导和编程指南,旨在让每位参与者都可以顺利入门并逐步掌握高级技巧。同时提醒使用者务必注意合法合规地运用此类技能。
珠宝门店营销管理导购绩效考核表
员工晋升管理规定
人力资源+大数据+薪酬报告+涨薪调薪,在学习、工作生活中,越来越多的事务都会使用到报告,通常情况下,报告的内容含量大、篇幅较长。那么什么样的薪酬报告才是有效的呢?以下是小编精心整理的调薪申请报告,欢迎大家分享。相信老板看到这样的报告,一定会考虑涨薪的哦。
绩效考核方案(医药公司)
Python源码实例07之对数据分析时判断只能选择Excel或者CSV文件.zip
1、文件内容:alsa-plugins-samplerate-1.1.6-1.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/alsa-plugins-samplerate-1.1.6-1.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
基于OPC UA Client的数据读取与多途径数据传输:Socket通信、数据库保存及OPC DA SERVER转换,使用OPC UA Client读取服务器的数据,可以使用Socket对外提供数据,可以保存到数据库,可以转为OPC DA SERVER对外提供数据。 ,核心关键词:OPC UA Client; 读取服务器数据; Socket通信; 数据保存; 数据库; 转换为OPC DA SERVER。,"OPC UA Client数据读取与转换:Socket通信、数据库保存及OPC DA SERVER输出"
Python源码实例09之如何使用tkinter模块弹出不同种类的消息提示框.zip
JavaScript 实现钢琴特效(打开HTML即可看到效果)
陇顶728用户好评反馈合集
新能源公司绩效考核管理制度
基于python机器学习9种模型实现心脏病发病预测源码+心脏病数据集+详细注释(高分比赛项目) 【项目介绍】 模型构建与训练:运用 9 种不同的模型架构进行搭建,这些模型可能包括常见的机器学习模型如决策树、随机森林、支持向量机等,也可能涉及深度学习模型如神经网络。针对每种模型,使用预处理后的数据进行训练,通过调整模型的参数(如决策树的深度、神经网络的层数和节点数等),利用合适的损失函数和优化算法(如梯度下降法),使模型能够学习到数据中的模式和规律,尽可能准确地拟合数据,以提高预测的准确性。 模型评估与选择:采用多种评估指标(如准确率、召回率、F1 值、AUC - ROC 曲线等)对训练好的 9 种模型进行评估。比较不同模型在这些指标上的表现,分析每个模型的优势和劣势,从而选择出在预测心脏病方面性能最优的模型,或者根据实际应用场景综合考虑多个模型的组合,以达到更好的预测效果。 预测与应用:将经过评估和选择后的模型应用于新的患者数据,对患者是否患有心脏病进行预测。输出预测结果,并可能提供相应的风险等级或概率估计,为医生的临床诊断提供辅助参考,帮助医生更高效、准确地判断患者的病情,制定合理的
IT项目绩效管理
三电平NPC型APF模型预测控制开关频率优化研究:滞环控制模块应用及效果分析,降低开关频率的三电平npc型APF的模型预测控制。 同等参数下传统的模型预测控制的开关频率大概在4392Hz附近,经过添加滞环控制模块后,开关频率降到了3242Hz,效果显著。 ,核心关键词:降低开关频率; 三电平NPC型APF; 模型预测控制; 滞环控制模块; 开关频率下降。,"优化三电平NPC型APF:模型预测控制降低开关频率至3242Hz"
杨鹏程24年度工作总结及规划
ComfyUI工作流文件和开发API文件 更多内容可以查阅 工作流讲解,文件和文件汇总: 《ComfyUI工作流教程、软件使用、开发指导、模型下载》https://datayang.blog.csdn.net/article/details/145220524 图形桌面工具使用教程: 《我的AI工具箱Tauri+Django环境开发,支持局域网使用》https://datayang.blog.csdn.net/article/details/141897682
Python源码实例01之如何以当前日期批量创建文件.zip
ComfyUI工作流文件和开发API文件 更多内容可以查阅 工作流讲解,文件和文件汇总: 《ComfyUI工作流教程、软件使用、开发指导、模型下载》https://datayang.blog.csdn.net/article/details/145220524 图形桌面工具使用教程: 《我的AI工具箱Tauri+Django环境开发,支持局域网使用》https://datayang.blog.csdn.net/article/details/141897682
C#实现西门子PLC数据通信读写:集成OPC、Socket与数据库的技术实践,C#读写西门子PLC.OPC.数据库.Socket 1、PLC数据通信读写; 2、联合OPC; 3、联合Socket; 4、联合数据库; ,核心关键词:C#读写; PLC数据通信读写; 联合OPC; 联合Socket; 联合数据库。,"C#实现PLC与数据库通信:OPC与Socket联合应用"