GO语言版鹅厂广告交易实时平台价格解析
腾讯广告实时交易平台在向竞价胜出一方返回成交价的时候,先对价格进行TEA加密,再对密文进行BASE64编码,接收方先对BASE64解码,再对密文解密,双方事先约定密钥。鹅厂官网提供了C#、C++、JAVA和PHP的解密代码包,无奈原有平台都是基于GO语言的,虽然可以调C++的静态库(libdecrypt.a),但开发工具是JetBrains GoLand,跑在Windows 7下后期难以调试,在虚拟机下跑linux版严重影响开发效率,不得不尝试改写为GO语言直接调用来的酣畅淋漓,主要原因还是太穷买不起MacBook。
原本觉得是个小活儿分分钟就可以搞定,没想到是个花了十二个工时的脏活累活,压根不是抄抄写写那么简单,一个坑接着一个坑。libdecrypt.a静态库在编译的时候没有加入调试信息完全无法跳入,jar倒是可以反编译看到源码,但编译器对部分中间变量做了优化处理,尤其对部分逻辑还原的带有强烈的个人感情色彩,IDEA和Java Decompiler两个工具自说自话,连被优化掉的变量命名都那么令人忍俊不禁。
调试的时候问题百出,只能左手跑JetBrains GoLand,右手跑IntelliJ IDEA,两边同时Step Out | Into跟踪,检查输入输出发现问题再解决问题,数次打算放弃名正言顺直接调用C++库,毕竟项目进度摆在那里男人何苦为难自己,不过坚持不懈是我唯一拿得出手值得炫耀的品格了,况且没准这个问题或许就是最后一个问题了呢。
罗里吧嗦说说遇到的坑吧!
坑一:GO语言做<<操作的时候高位溢出部分舍弃,C\C++和JAVA补1,需要对0xffffffff取反以后再做位置或操作;
坑二:GO语言“+”优先级高于“^”,在改写C\C++和JAVA表达式的时候需要加括号提升优先级,如:z -= int64(y << 4) + int64(c) ^ (y + sum ^ ((y >> 5) + int64(d)));
坑三:已知a := []int{1, 2, 3, 4, 5, 6}; b := a[:],二者指向同一内存空间,没有达到b = (int[])a.clone() 的目的;
坑四:GO语言没有“>>>”无符号右移运算符;
坑五:GO语言[]byte取值范围0-255,与JAVA的byte[]对应的是[]int8;
代码下载地址:https://gitee.com/gonglibin/codes/67lj5sv43bdegrm2ah81x21
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Go语言学习重点
近年来多核化和集群化正在成为了互联网时代发展的典型特征,Go语言的设计者们宣称对C、C++、java、C#、Delphi,乃至于PHP、Python、Perl、Ruby等语言感到深深的沮丧,他们要创造一门新的编程语言来满足分布式和并行计算的要求,事实也证明现在国内许多互联网公司在编写大并发高效处理的服务业务首选Go作为开发语言。对于C、C++、java和C#开发工程师来说,学习Go会非常轻松,特别是抓住下面的知识点,上手是分分钟的事情。 并发编程模型分为两个流派:共享内存流派和消息传递流派,gotoutine和channel构成go语言的基础,虽然go语言支持共享内存,但还是忘记它吧,只有channel才能把gotoutine的性能发挥到极致; go语言是强制统一代码风格的编程语言,首字母大写的变量、函数和方法等同于公有属性为包外可见,否则为对象私有包外不可见,变量函数命名规则主流有骆驼命名法(JAVA和C#)和下划线法(C),强烈建议骆驼法,左花括号必须位于行尾否则编译不给过,如果不能改变就不要吐槽go的编码风格; go语言支持函数多返回值,如:f, err := os.Open(f...
- 下一篇
LeetCode刷题指南(Java版)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a724888/article/details/81389292 微信公众号【Java技术江湖】一位阿里 Java 工程师的技术小站。(关注公众号后回复”Java“即可领取 Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源) 参考@CyC2018的leetcode题解。Java工程师LeetCode刷题必备。主要根据LeetCode的tag进行模块划分,每部分都选取了比较经典的题目,题目以medium和easy为主,少量hard题目。 我在@CyC2018大佬的基础上又加上了部分题解,并且筛选了比较经典的题目,去除了比较晦涩难懂的题目,以及一些很少考的题目,以便大家积累经验,在面试笔试中能够游刃有余。 详情请见我的仓库:https://github.com/h2pl/leetcode 数组和矩阵 把数组中的 0 移到末尾 283. Move Z...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Mario游戏-低调大师作品
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Linux系统CentOS6、CentOS7手动修改IP地址
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Hadoop3单机部署,实现最简伪集群
- CentOS7安装Docker,走上虚拟化容器引擎之路