C#在与java对接时候的UrlEncode的坑
最近与建行接口做对接和与一家短信运营商做对接时候遇到了这个坑
在java中对UrlEncode 时候哪些url非安全字符被转为%数字和大写字幕组合,比如:zhangsan/d 会被转为 zhangsan%2Fd ,而在C#中确被转为 zhangsan%2fd 。注意大小写的差异
然后就导致了各种加密验签无法通过的情况。
于是就自己在C#原来的UrlEncode的基础上写了一个UrlEncode方法
/// <summary>
/// Url编码
/// </summary>
/// <param name="str">原字符串</param>
/// <param name="encoding">编码格式</param>
/// <param name="upper">特殊字符编码为大写</param>
/// <returns></returns>
static string UrlEncode(string str, Encoding encoding)
{ if (encoding == null)
{
encoding = UTF8Encoding.UTF8;
}
byte[] bytes = encoding.GetBytes(str);
int num = ;
int num2 = ; for (int i = ; i < bytes.Length; i++)
{
char ch = (char)bytes[i];
if (ch == ' ')
{
num++;
}
else if (!IsUrlSafeChar(ch))
{
num2++; //非url安全字符
}
} if (num == && num2 == )
{
return str; //不包含空格和特殊字符
} byte[] buffer = new byte[bytes.Length + (num2 * )]; //包含特殊字符,每个特殊字符转为3个字符,所以长度+2x
int num3 = ;
for (int j = ; j < bytes.Length; j++)
{
byte num6 = bytes[j];
char ch2 = (char)num6;
if (IsUrlSafeChar(ch2))
{
buffer[num3++] = num6;
}
else if (ch2 == ' ')
{
buffer[num3++] = 0x2B; //0x2B代表 ascii码中的+,url编码时候会把空格编写为+
}
else
{
//特殊符号转换
buffer[num3++] = 0x25; //代表 %
buffer[num3++] = (byte)IntToHex((num6 >> ) & ); //8位向右移动四位后 与 1111按位与 ,即保留高前四位 ,比如 /为 2f,则结果保留了2
buffer[num3++] = (byte)IntToHex(num6 & ); //8位 ,与00001111按位与,即保留 后四位 ,比如 /为2f,则结果保留了 f }
} return encoding.GetString(buffer); } static bool IsUrlSafeChar(char ch)
{
if ((((ch < 'a') || (ch > 'z')) && ((ch < 'A') || (ch > 'Z'))) && ((ch < '') || (ch > '')))
{ switch (ch)
{
case '(':
case ')':
case '*':
case '-':
case '.':
case '!':
break; //安全字符 case '+':
case ',':
return false; //非安全字符
default: //非安全字符
if (ch != '_')
{
return false;
}
break;
}
}
return true;
} static char IntToHex(int n) //n为0-f
{
if (n <= )
{
return (char)(n + 0x30); //0x30 十进制是48 对应ASCII码是0
}
return (char)((n - ) + 0x41); //0x41 十进制是 65 对应ASCII码是A
}
C#在与java对接时候的UrlEncode的坑的更多相关文章
- Java对接拼多多开放平台API(加密上云等全流程)
前言 本文为[小小赫下士 blog]原创,搬运请保留本段,或请在醒目位置设置原文地址和原作者. 作者:小小赫下士 原文地址:Java对接拼多多开放平台API(加密上云等全流程) 本文章为企业ERP(I ...
- 关于Java解压文件的一些坑及经验分享(MALFORMED异常)
文章也已经同步到我的csdn博客: http://blog.csdn.net/u012881584/article/details/72615481 关于Java解压文件的一些坑及经验分享 就在本周, ...
- JAVA基础(零)—— 踩坑与错误(常更)
JAVA基础(零)-- 踩坑与错误(常更) 1 坑 考虑输入为null的情况 自动转换 x/Math.pow(10,i)*Math.pow(10,i) //由于math.pow()返回double类型 ...
- C#对接JAVA系统遇到的AES加密坑
起因对接合作伙伴的系统,需要对数据进行AES加密 默认的使用了已经写好的帮助类中加密算法,发现结果不对,各种尝试改变加密模式改变向量等等折腾快一下午.最后网上查了下AES在JAVA里面的实现完整代码如 ...
- java对接微信支付
对接微信扫码支付(模式2),前端使用velocity技术 (1)调用微信支付接口(view层) 此部分业务逻辑部分可以省略 @RequestMapping("/wxpay.htm" ...
- java对接短信平台
短信验证码目前是比较主流验证身份的一种方式,下面分享下我对接的几种短信平台 阿里云短信:https://api.alidayu.com/docs/api.htm?spm=a3142.7395905.4 ...
- Java对接微信公众号模板消息推送
内容有点多,请耐心! 最近公司的有这个业务需求,又很凑巧让我来完成: 首先想要对接,先要一个公众号,再就是开发文档了:https://developers.weixin.qq.com/doc/offi ...
- Java对接微信登录
今天我们来对接微信开放平台的网站应用登录 首先上文档链接:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login ...
- Razorpay支付对接,JAVA对接篇
Razorpay 作为印度本土的一家支付公司,类似中国的支付宝 微信,本篇记录一下对接印度第三方支付公司 准备工作: 注册公司 申请Razorpay账号 申请正式环境 Razorpay工作台: 获取k ...
随机推荐
- HTTP请求中怎样选择Get和Post方式
在应用中最经常使用的Http请求无非是get和post,get请求能够获取静态页面,也能够把參数放在URL字串后面,传递给servlet.post与get的不同之处在于post的參数不是放在URL字串 ...
- 字符串输入时的strlen()与\0
在做串的数据结构时,被字符串printf %s输出时的结尾判断.strlen();长度.自定义StrCopy();字符串复制函数.StrAssign();字符串赋值函数卡了一下,固写此博巩固相关知识点 ...
- 用keras作CNN卷积网络书本分类(书本、非书本)
本文介绍如何使用keras作图片分类(2分类与多分类,其实就一个参数的区别...呵呵) 先来看看解决的问题:从一堆图片中分出是不是书本,也就是最终给图片标签上:“书本“.“非书本”,简单吧. 先来看看 ...
- Java I/O---Properties类(持久化键值对)
1.Properties类简介 Properties类(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置文件中很多变量是经常改变的,这 ...
- Run a task only once in (akka) cluster
在stackOverflow网站上看到这一提问,下文是部分摘抄问题简述: Java cluster, run task only once We have a java process, which ...
- 724. Find Pivot Index
Given an array of integers nums, write a method that returns the "pivot" index of this arr ...
- ArcGIS API for JavaScript 4.2学习笔记[18] 搜索小部件
这个例子很简单,作为开学后(暴露出学生党的本质)的开胃菜是再合适不过了. 不过,博主提前警告一下:接下来的例子会相当的长.烦.难.我还会用"引用"-"函数参数骨架&quo ...
- iOS网络模块优化(失败重发、缓存请求有网发送)
iOS开发中,一般都是通过AFN搭建一个简易的网络模块来进行与服务器的通信,这一模块要优化好没那么简单,需要花费很多时间与精力,仅仅根据这几年来的填坑经验,总结下这一块的需要注意的地方,也是给自己梳理 ...
- 详解PHP反射API
PHP中的反射API就像Java中的java.lang.reflect包一样.它由一系列可以分析属性.方法和类的内置类组成.它在某些方面和对象函数相似,比如get_class_vars(),但是更加灵 ...
- input 上传图片显示预览、调用摄像头,ios和Android的兼容性解决
html代码: <img id="pic" src="img/pic.png"/> </span><input id=" ...