字符串ASCII码排序
对接第三方渠道的支付API时,三方给的数据签名规则,其中一条是要求参数按照ASCII码从小到大排序。
如下是渠道方有关生成签名规则的java代码示例:
//初始化0010merkey.private文件:
String merchantprivatekey;
merchantprivatekey=PayCfg.getValue("0010merchantprivatekey"); // 将要签名的数据传给map
TreeMap map = new TreeMap();
StringBuffer sbf = new StringBuffer();
map.put(orderNo,’0010100000000011’);
map.put(productId,’0010’);
// 需要签名值字符串
Iterator iterator = map.keySet().iterator();
while (iterator.hasNext()) {
Object key = iterator.next();
//并将获得的值进行拼接
String value=(String)map.get(key); System.out.println("map:"+key+":======================="+value);
sbf.append((String)map.get(key));
}
//签名signdata
String signdata = SignAndVerify.sign_md(sbf.toString(), "",merchantprivatekey);
}
(1)注释:初始化私钥,通过参数名称,获得相应的参数值,并encode成utf-8格式
(2)通过实例化map对象,TreeMap map = new TreeMap();
(3)TreeMap()会将数据名称按照AscII码值的大小进行排序
(4)循环map中的值,并将这些值拼接起来==》sbf
(5)调用jar包中的SignAndVerify的sign_md方法,对sbf串进行加签。
我们的.NET(C#)程序对接时,map用的是有序字典SortedDictionary<string,string>。在后续的对接联调过程中发现,有的接口请求可以正常返回,而有的接口请求收到的响应报文是验签失败。
进一步排查,发现有序字典并不是按照ASCII码排序的,用集合的OrderBy()方法、Array.Sort也是如此。此时,解决方案是在用Array.Sort时指定一个参数string.CompareOrdinal。string.CompareOrdinal先把每个字符转成相应的十进制数值(如 a 对应97,b对应98,A对应65,B对应66),然后再对十进制数值进行比较。
[TestMethod]
public void ASCIISort()
{
IDictionary<string, string> dics = new SortedDictionary<string, string>();
dics.Add("21amount", "amount");
dics.Add("2callback_url", " callback_url");
dics.Add("Agoodsname", "goodsname");
dics.Add("amerchno", "merchno");
dics.Add("bnotify_url", "notify_url");
dics.Add("Bordno", "ordno");
dics.Add("3organno", "organno");
dics.Add("version", "version");
dics.Add("paytype", "paytype"); var array = dics.Keys.ToArray(); Console.WriteLine();
foreach (string s in array)
{
Console.Write(s + "\t");
} // Array.Sort
Array.Sort(array, string.CompareOrdinal); Console.WriteLine();
foreach (string s in array)
{
Console.Write(s + "\t");
}
}
测试结果:
ref:http://www.cnblogs.com/similar/p/6739293.html
字符串ASCII码排序的更多相关文章
- C# 字符串按 ASCII码 排序,注意其中的小坑
https://www.cnblogs.com/similar/p/6739293.html 在和银行做数据对接时,涉及到数据传输时的验签及加密.其中数据签名方案中就要求数据项根据属性名按 ASCII ...
- C# 参数签名字符串按 ASCII码排序,注意其中的坑
参数签名中通常是按键值对中键名称的ASCII按从小到大的顺序排序后进行hash为签名字符串.不要直接使用 SortedDictionary<string, string> 有坑的,他是按数 ...
- ASCII码排序
ASCII码排序 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入 第一行输 ...
- ASCII码排序 南阳acm4
ASCII码排序 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入 第一行输 ...
- NYOJ4——ASCII码排序
ASCII码排序 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述:输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入:第一行输入一 ...
- 杭电2000——ASCII码排序
/* ASCII码排序 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- 2000 ASCII码排序
声明:从今天开始每周至少做七道杭电ACM题,锻炼思考能力. 2000 ASCII码排序 Problem Description 输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符. ...
- 【hdu2000】ASCII码排序
题目来源:www.acm.hdu.edu.cn 题目编号:2000 ASCII码排序 /*----------------------------------------原题目------------ ...
- 难度2:ASCII码排序
ASCII码排序 难度:2描述: 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入: 第一行输入一个数N,表示有N组测试数据.后面的N行输入多组数据,每组输入数据 ...
随机推荐
- .NET Core 2.0 单元测试中初识 IOptionsMonitor<T>
在针对下面设置 CookieAuthenticationOptions 的扩展方法写单元测试时遇到了问题. public static IServiceCollection AddCnblogsAut ...
- 查看dsym的报错信息(友盟)
//搜索显示报错信息的命令在终端直接运行(来源老版提示) export dSYMPath="$(find ~/Library/Developer/Xcode -iname '*.dSYM' ...
- webpack dev server 配置 启动项目报错Error: listen EADDRINUSE
Error: listen EADDRINUSE 0.0.0.0:5601 它的意思是,端口5601被其他进程占用. 切换端口即可解决问题
- Chap3:文件系统中跳转[The Linux Command Line]
1 introduce the following commands pwd - Print name of current working directory cd-Change directory ...
- [daily][centos] redhat增加扩展仓库
https://rpmfusion.org/Configuration sudo yum localinstall --nogpgcheck https://download1.rpmfusion.o ...
- ORACLE network environment
监听程序 建立网络连接 要建立客户机或中间层连接,Oracle Net要求客户机 下列事项: 运行监听程序的主机 监听程序监视的端口 监听程序使用的协议 监听程序处理的服务名 Hostname/ip ...
- LeetCode 884 Uncommon Words from Two Sentences 解题报告
题目要求 We are given two sentences A and B. (A sentence is a string of space separated words. Each wo ...
- LeetCode 500 Keyboard Row 解题报告
题目要求 Given a List of words, return the words that can be typed using letters of alphabet on only one ...
- elasticsearch解决控制台中文乱码问题
找到conf目录下的jvm.options文件,找到如下的配置行: 我将之前的UTF-8 改成GBK,ok.
- Matplotlib 简单的使用
Matplotlib是一个Python 2D绘图库, 只需几行代码即可生成绘图,直方图,功率谱,条形图,错误图,散点图等. 有关示例,请参阅示例图和缩 import matplotlib.pyplot ...