2014年3月14日,星期五, 23点22分

忙碌、焦头烂额、充实而又幸福的一天!

写在篇头的话:

许多时候,别人分享的经验(成功或失败),个中滋味,听者很难真正体会,直到自己遇到的那一瞬间,才会泪如雨下,幡然醒悟......

今天将之前写的MATLAB版本的程序,用C#重新实现。原因嘛,不得不发句牢骚,MATLAB打包成exe后,启动时间都要几十秒甚至一两分钟,真是急死人的节奏啊!(每次给别人演示的时候,双击图标后到要和别人先聊会儿天,无语吧!)

言归正传,遇到的问题是,利用post方法将一些数据提交给服务器的网页中,数据采用base64编码。悲剧发生了:c#版本提交的数据,服务器居然无法进行正确的base64解码!调试后发现,c#端的base64编码完全正确,没有任何问题,相同的数据用MATLAB提交给服务器,服务器完美解码!这是啥情况?难道服务器也欺生么?

显然不是!在万般无奈之下,用PHP(服务器端的网页是用PHP写的哈)自己写了一个base64解码函数(PHP自带的函数是base64_decode,你不是不给我正确答案么?哼!哥还不用你了,走着瞧!),当我以为大功告成时,悲剧再次降临!一部分数据可以正确解码,还有一部分数据依然不对!仔细检查,自己写的解码函数没问题啊,是哪里出错了呢?

经过一步一步调试,终于发现,base64编码后的字符串中经常包含“+”号,在C#环境中发送给服务器后,服务器把“+”号存成了“ ”(空格),而MATLAB发送的数据,服务器依然存为“+”号!找到问题就好办了,服务器解码前,先把字符串中的“ ”替换成“+”号,完美解决!

base64_decode,我错怪你了,sorry!

遗留问题:为什么会出现这种现象呢?目前猜测是与post时的编码方式有关,尚未确诊,继续寻找中......

结束语:

我们经常会遇到各种各样“奇葩”的棘手问题,在这种情况下,千万不要第一时间试图去绕开它,而去寻找替代的解决方案。当你庆幸地以为寻找到一条“捷径”时,可能那个坎还在前方等着你!到最后会发现,其实问题的本质在另外一个地方,只是你还没有发现它!

纠结的一天 —— 由base64编解码与加号、空格引起的更多相关文章

  1. Delphi Base64 编解码函数

    Delphi 自带 Base64 编解码的单元, EncdDecd这个单元提供两套四个公开函数: 对流的编解码:procedure EncodeStream(Input, Output: TStrea ...

  2. ios Base64编解码工具类及使用

    为了避免明码传递http内容,可以用base64编码后传输,收到方再解码,也方便了2进制数据的字符串式传输. 对于ios来说,google给提供了一个很好的工具类,方便进行base64编解码,当然也可 ...

  3. Java实现BASE64编解码

    Java实现BASE64编解码 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs BASE64和其它类似的编码算法通经常使用于转换二进制数据为文本数据,其目 ...

  4. Delphi 自带的 Base64 编解码函数

    今天帮别人解决一个关于 Base64 编解码的问题,竟然发现 Delphi 自带了 Base64 编解码的单元,叫 EncdDecd,这名字很拗口而且不直观,估计这是一直很少人关注和知道的原因. 这个 ...

  5. openssl命令行Base64编解码

    openssl对base64编解码的规范支持较差,用它编解码的结果别的语言如php处理很不方便,注意的几点整理如下 1,如果php加密结果做base64编码长度小于64,则需要添加一个换行符opens ...

  6. python rsa 加密解密 (编解码,base64编解码)

    最近有需求,需要研究一下RSA加密解密安全:在网上百度了一下例子文章,很少有文章介绍怎么保存.传输.打印加密后的文本信息,都是千篇一律的.直接在一个脚本,加密后的文本信息赋于变量,然后立马调用解密.仔 ...

  7. python base64 编解码,转换成Opencv,PIL.Image图片格式

    二进制打开图片文件,base64编解码,转成Opencv格式: # coding: utf-8 import base64 import numpy as np import cv2 img_file ...

  8. EasyDarwin开源流媒体云平台中boost Base64编解码后与源长度不匹配的bug

    本文转自EasyDarwin团队Alex的博客:http://blog.csdn.net/cai6811376 EasyDarwin云平台中部分协议使用了Base64编码昨晚报文通信的载体.比如在对摄 ...

  9. C++,Base64编解码字符串或文件

    参考链接:在C语言中使用libb64进行Base64编解码 GitHub地址:https://github.com/BuYishi/cpp_base64_demo base64_demo.cpp #i ...

随机推荐

  1. 剑指offer——面试题6:从尾到头打印链表

    #include"iostream" #include"stdio.h" #include"stack" using namespace s ...

  2. 昨天太晚了,今天教你用Debug模式来分析程序执行顺序

    还是以昨天的XML文件解析来做栗子,希望通过这个好吃的栗子可以举一反三 学会用debug来看源码和找Bug 事件类型主要有五种START_DOCUMENT:xml头的事件类型    = 0END_DO ...

  3. 生产者与消费者模式-阻塞 wait,notify

    设计思路:生产者push ,消费者 拿,篮子装,syncstack先进后出,while 判断 index=0 wait,      当 Producer生产了 并push到篮子里  notify(唤醒 ...

  4. Windows 那些坑

    Windows Qt搭建 安装Qt 选择MinGW或者MSVC(建议VC), qt自动检测编译器, 基本上不用配置 去掉UWP(Windows通用平台开始, 不同于传统的exe, 它可以运行在所有的W ...

  5. 关于两个 IQueryable 合并

    原先根据需求要对数据进行两种筛选,起初写过滤条件,但是过滤后发现有的数据重叠.因此改为查询两次. 因为查询后返回的是两个相同的.匿名的 IQueryable ,最终的目的是想两个 类型结合成一个. 参 ...

  6. java冒泡排序 常规排序和优化排序

    冒泡排序原理在于两两比较,看你需要把大值放最前面还是最后面, 我们看看把大值放在后面:比如数组[7, 5, 6] 开始排序第1个数字 :7 arr:[7, 5, 6] 开始排序第2个数字 :5 arr ...

  7. Mac下抓包工具Charles4.0下载及使用

    Charles是一款运行在你自己计算机上的web代理工具,可以有效地获取http通信信息,主要用于网页的开发和调试等. 安装 以下为来自史蒂芬周的博客的Charles 4.0 Mac破解版 下载地址: ...

  8. 高效的jQuery代码编写技巧

    缓存变量 DOM遍历是昂贵的,所以尽量将会重用的元素缓存. // 糟糕 h = $('#element').height(); $(); // 建议 $element = $('#element'); ...

  9. C++基础--结构体声名

    struct是一种数据结构,当需要存储的相关数据为一个集合时,struct是很好的选择;例如,当存储student,学生的学号, 名字,年龄,身高,就构成了一个集合,用stuct声名为: typede ...

  10. angular.uirouter

    首先给大家介绍angular-ui-router的基本用法.如何引用依赖angular-ui-router angular.module('app',["ui.router"]). ...