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 ...
随机推荐
- MobileNets总结
Google在2017年上半年发表了一篇关于可以运行在手机等移动设备上的神经网络结构--MobileNets.MobileNets是基于深度可分离卷积(depthwise separable conv ...
- Java数组的一些使用方法及堆栈存储
数组 用于存储一组同一数据类型数据的容器 数组会对放入其中的数据自动编号,编号是从0开始的---下标 定义格式 数据类型[] 数组名 = new 数据类型[数组的大小];---可以先声明再初始化 in ...
- 自学Zabbix3.9.1-模板Templates-创建
自学Zabbix3.9.1-模板Templates-创建 1. 模板介绍 模板是一组可以方便地应用于多个主机的实体. 实体可能是: 项目 触发器 图 应用程序 屏幕(因为Zabbix 2.0) 低层次 ...
- springMVC学习总结(四)springmvc处理json数据类型以及fastjson的使用
springMVC学习总结(四)springmvc处理json数据类型以及fastjson的使用 主要内容: 这篇文章主要是总结之前使用springmv接收json的时候遇到的问题,下面通过前台发送a ...
- [.Net跨平台]部署DTCMS到Jexus遇到的问题及解决思路---Linux环境搭建
最近朋友托我帮忙研究如何把一个DTCMS部署到Linux下,经过1天的研究,部署基本成功,可能有些细节还未注意到,现在把心得分享一下.过程比预期的要简单 身为.Net程序员,这个问题的第一步可能就是如 ...
- 微信小程序教学第四章第三节(含视频):小程序中级实战教程:详情-功能完善
详情 - 功能完善 本文配套视频地址: https://v.qq.com/x/page/f0555nfdi14.html 开始前请把 ch4-3 分支中的 code/ 目录导入微信开发工具 这一节中, ...
- JMeter获取CSV文件行数
import java.io.BufferedReader; import java.io.FileReader; BufferedReader br=new BufferedReader(new F ...
- 通过SQL创建一个有主键自动递增有默认值不为空有注释的表
-- create database db_std_mgr_sys; use db_std_mgr_sys; create table student( std_id bigint not null ...
- 如何在markdown中插入表情
Markdown是很好用的呀,个人灰常的喜欢,也是灰常漂亮的,但是如何在写文章的时候插入表情呢,下面给出一部分代码
- ArcGIS API for JavaScript 4.2学习笔记[11] 官方第五章Popups(弹窗)概览与解释
直接跳过第三第四章了,第三章Layer和第四章可视化,怎么说呢,Layer是组织数据的,是Map的属性之一.可视化属于符号化编程,暂时不看. 第五章是对数据.结果的显示,类似于alert()..NET ...