字符串ASCII码排序

在对接第三方支付渠道的时候,第三方会要求参数按照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程序对接时,首先想到的是用SortedDictionary<string,string>。对接过程中发现,有的接口生成的签名是正确的,有的接口生成的签名后调用得到的响应报文说验签失败。

进一步排查,发现有序字典并不是按照ASCII码排序的,用集合的OrderBy()方法、Array.Sort也是如此。此时,解决方案是在用Array.Sort时指定一个参数string.CompareOrdinal。string.CompareOrdinal会把每个字符先转成相应的数值(如 a 转为数值 97),然后再对数值进行比较。

[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

时间: 2024-07-30 10:04:33

字符串ASCII码排序的相关文章

C# 参数签名字符串按 ASCII码排序,注意其中的坑

参数签名中通常是按键值对中键名称的ASCII按从小到大的顺序排序后进行hash为签名字符串.不要直接使用 SortedDictionary<string, string> 有坑的,他是按数字.小写字母.大写字母的顺序排的,实际规则应该是数字.大写字母.小写字母的顺序来排才对.一直使用他在支付宝和微信的接口中都没问题,因为支付宝和微信的单词是用下划线分隔的,今天接入的一家支付公司用的驼峰命名法坑就出现了.正确的打开姿势如下: /// <summary> /// ASCII值排序 //

ASCII码排序 南阳acm4

ASCII码排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入 第一行输入一个数N,表示有N组测试数据.后面的N行输入多组数据,每组输入数据都是占一行,有三个字符组成,之间无空格. 输出 对于每组输入数据,输出一行,字符中间用一个空格分开. 样例输入 2 qwe asd 样例输出 e q w a d s 来源 网络 上传者 naonao 具体实现看代码: #include<st

ASCII码排序

ASCII码排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入 第一行输入一个数N,表示有N组测试数据.后面的N行输入多组数据,每组输入数据都是占一行,有三个字符组成,之间无空格. 输出 对于每组输入数据,输出一行,字符中间用一个空格分开. 样例输入 3 qwe asd zxc 样例输出 e q w a d s c x z #include "stdio.h"void

ACM:ASCII码排序

ASCII码排序:http://acm.nyist.net/JudgeOnline/problem.php?pid=4 绝不重新造轮子. #include<iostream> #include<string> #include<algorithm> using namespace std; int main() { int n = 0; cin >> n; for (int i = 0; i < n; ++i) //多次测试 { string str;

hdu 2000 ASCII码排序

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2000 题目大意:按各字符的ASCII码从小到大的顺序进行排序 注意格式哦!输出时字符中间用一个空格分开 1 #include<stdio.h> 2 int main() 3 { 4 char a,b,c,t; 5 while(scanf("%c%c%c",&a,&b,&c)!=EOF) 6 { 7 getchar(); 8 if(a>b) 9 {

nyist 4 ASCII码排序

ASCII码排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入 第一行输入一个数N,表示有N组测试数据.后面的N行输入多组数据,每组输入数据都是占一行,有三个字符组成,之间无空格. 输出 对于每组输入数据,输出一行,字符中间用一个空格分开. 样例输入 3 qwe asd zxc 样例输出 e q w a d s c x z error #include<stdio.h>int

2000 ASCII码排序

声明:从今天开始每天做一道杭电ACM题,锻炼思考能力. 2000  ASCII码排序 Problem Description 输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符. Input 输入数据有多组,每组占一行,有三个字符组成,之间无空格. Output 对于每组输入数据,输出一行,字符中间用一个空格分开. Sample Input qwe asd zxc Sample Output e q w a d s c x z #include<stdio.h> int mai

杭电 HDU ACM 2000 ASCII码排序

ASCII码排序 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 103963    Accepted Submission(s): 43442 Problem Description 输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符. Input 输入数据有多组,每组占一行,有三个字符组成,之间无空格. Output

hdu2000 ASCII码排序【C++】

ASCII码排序 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 206054    Accepted Submission(s): 82273 Problem Description 输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符. Input 输入数据有多组,每组占一行,有三个字符组成,之间无空格. Output