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

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

/// <summary>
/// ASCII值排序
/// </summary>
public class OrdinalComparer : System.Collections.Generic.IComparer<String>
{public int Compare(String x, String y){return string.CompareOrdinal(x, y);}
}
//使用
//SortedDictionary<string, string> sDic 待排序的键值对
var sArr = sDic.OrderBy(x => x.Key, new OrdinalComparer()).ToDictionary(x => x.Key, y => y.Value);
//然后 foreach sArr 就OK了//或者转为数组再排序
string[] arr = new string[sDic.Count];
Array.Sort(arr, string.CompareOrdinal); //ASCII排序

 

在和银行做数据对接时,涉及到数据传输时的验签及加密。其中数据签名方案中就要求数据项根据属性名按 ASCII码 进行升序排序。C#中的ASCII码排序并不是表面上那么简单,一不小心就入坑了。因为C#的排序默认并不是按照ASCII码进行排序的。举个例子, 我有这样一个字符串数组,然后对其排序。

string[] vv = { "1", "2", "A", "a", "B", "b" };
Array.Sort(vv); //结果 1 2 a A b B

如果是按照ASCII码进行排序的话,顺序应该是: 1, 2, A, B, a, b  而实际排序后的结果则是:1, 2, a, A, b, B . 这也就是说Sort()方法默认情况下并不是按ASCII码进行排序的。之后我也同样测试了C#中的OrderBy()的排序,发现它默认情况下也并不是按照ASCII码进行的排序。

string[] vv = { "1", "2", "A", "a", "B", "b" };
vv.OrderBy(x => x); //结果 1 2 a A b B

 那么既然默认排序不是按ASCII码进行的排序,我们要怎么做呢? 看下面代码,只需要在原来排序方法上再加个参数: string.CompareOrdinal。string.CompareOrdinal会把每个字符先转成相应的数值(如 a 转为数值 97),然后再对数值进行比较。

Array.Sort(vv, string.CompareOrdinal); //ASCII排序

注:掉入这个坑是因为起初不知道如何对字符做ASCII码排序,于是百度了一把。得到的结果就是这个 C# 参数按照ASCII码从小到大排序(字典序)  而当我采用这种方式时,银行验签那步始终通不过,调试发现我排序后的结果和银行那边的不同。这篇博文的博主可能自己也没发现这个坑吧。

整理来源:

http://www.cnblogs.com/similar/p/6739293.html

http://www.cnblogs.com/similar/p/6739293.html

转载于:https://www.cnblogs.com/JuneZhang/p/7295191.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/416237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络西北大学,西北大学计算机网络复习资料 (拟).doc

****计算机网络复习TOC \o "1-3" \h \z \u 一、计算机网络概论 3(一)计算机的形成与发展 3(二)计算机网络定义与分类 3(三)计算机网络结构 4(四)计算机网络的拓补构型 4(五)分组交换技术 4(六)典型的计算机网络 5(七)计算机网络-类似系统 5二、网络体系结构与网络协议…

centos mysql 允许远程访问

1、首先进入数据库&#xff0c;使用系统数据库mysql&#xff0c;登录 mysql -u root -p mysql 2、对系统数据库的root账户设置远程访问的密码&#xff0c;与本地的root访问密码并不冲突。123456为我设置的密码 grant all privileges on *.* to root%% identified by 123456 …

https简述

协议栈 https是在http应用层和tcp传输层之间加入了一个安全层&#xff08;SSL、TLS&#xff09; &#xff0c;加入安全层的主要目的是将传输内容加解密&#xff0c;这样就避免了传输内容被窃听后&#xff0c;泄露重要信息&#xff08;如用户名、密码&#xff09;&#xff0c;加…

Mac Apache 开启对php支持

1、在终端中以管理员身份打开Apache的配置文件。 sudo vi /etc/apache2/httpd.conf 2、找到#LoadModule php7_module libexec/apache2/libphp7.so&#xff0c;然后把光标定位到井号#&#xff0c;然后按下x键&#xff0c;删掉#&#xff0c;相当去掉注释。 3、保存退出 :wq! …

040、全卷积

之——FCN 目录 之——FCN 杂谈 正文 1.FCN 2.实现 杂谈 FCN&#xff08;Fully Convolutional Network&#xff09;是一种深度学习网络架构&#xff0c;专门设计用于语义分割任务。传统的深度学习网络如卷积神经网络&#xff08;CNN&#xff09;在处理图像时通常用于分类…

html不支持ie7,解决IE6/IE7/IE8不支持before,after问题

对从事web开发的朋友来讲&#xff0c;低版本的永远是一个痛点&#xff0c;不支持最新技术(如css3,html5)。在现在web开发中使用图标字体已经很广泛&#xff0c;如Font Awesome,Bootstrap等&#xff0c;字体图片主要是通过css选择器before,after结合content来实现&#xff0c;但…

前端学习(2511):路径出错

./node_modules/babel-loader/lib!./node_modules/vue-loader/lib/selector.js?typescript&index0!./src/ 原因路径出错&#xff0c;引入正确路径即可

HOJ 13828 Funfair

链接&#xff1a;http://acm.hnu.cn/online/?actionproblem&typeshow&id13828 Problem descriptionWe are going to a funfair where there are n games G1,...,Gn. We want to play k games out of the n games, and we can choose the order in which we play them—…

Z-Blog 爬虫 node实现

Z-Blog 爬虫 node实现 目前正在连载更新中 一、需求 帮朋友建站&#xff0c;指定用Z-Blog&#xff0c;安装后&#xff0c;我发现采集文章不便&#xff0c;所以准备写一个node爬虫&#xff0c;实现对友站文章的自动采集。 二、实现之前的思考 1、 熟悉Z-Blog数据库 Z-Blog使…

前端学习(2512):组件注册

app.vue <template><div id"app"><users></users></div> </template><script> import Users from ./components/User export default {name: App,data () {return {title: 这是我的第一个标题}},components: {users: Use…

中考物理可不可以用计算机,不能用计算机?2021年起广州中考课目改为“4+4”...

昨日&#xff0c;广州市教育局发布公告&#xff0c;明确提出广州将从2021年开始实施高中阶段学校考试招生制度改革(与在读初一学生相关)&#xff0c;改革实施前的2019至2020年为过渡期(与在读初二、初三学生相关)。从2021年开始&#xff0c;广州中考录取计分科目采用“44”模式…

superagent返回结果乱码

使用superagent返回结果乱码&#xff0c;处理编码的时候主要就分为utf-8以及gbk两大类&#xff0c;需要使用superagent-charset工具包解决问题 const charset require(superagent-charset); const superagent charset(require(superagent));const result await superagent.…

科学计算机java算法实现,(Java)科学型计算器开发及实现.doc

(Java)科学型计算器开发及实现淮北师范大学科学型计算器的开发与实现学 院 计算机科学与技术 专 业学 生 姓 名学 号指导教师姓名科学型计算器的开发与实现作 者&#xff1a;指导教师&#xff1a;摘 要&#xff1a;目前&#xff0c;科学计算器的应用非常广泛&#xff0c;从科研…

node process.env.NODE_ENV 使用 cross-env 配置 设置

process是一个全局对象&#xff0c;任意位置可以访问。在开发测试和正式部署时&#xff0c;需要区分不同的环境process.env.NODE_ENV&#xff0c;包括development和production&#xff0c;我推荐使用工具包cross-env实现在命令行中设置&#xff0c;解决跨平台问题。 1、全局安…

BI@Report烂笔头

有的时候&#xff0c;一定要设置浮动表元&#xff01;&#xff01;1. 一个红框就是一个报表2. 浮动表元 代表着按这个字段来group by&#xff08;但是数据库不能这么来&#xff09;3. _n求这个指标维的个数 sum(b2$)求和4. 小手抓数据 / 数据源中拖过去5. 当选择排序类型&#…

微型计算机相关的英文文献,微型计算机控制系统--------外文文献翻译

内容介绍Electronic systems are used for handing information in the most general sense; this information may be telephone conversation, instrument read or a company’s accounts, but in each case the same main type of operation are involved: the processing, …