.Net对接Java接口加密不通过?
前言
相信又不少小伙伴在对接第三方接口时遇到过这种情况:参数、排序、加密方式都按照接口文档进行处理了,可就是签名不通过,然后开始怀疑是不是参数漏了?参与加密的参数不对?还是加密方式有问题?最后一顿操作还是签名不通过😅
遇到这种情况怎么办呢?面向百度编程没有方向基本找不到解决方式,那就@一下对接人吧😁,然后你就会得到一个回复‘参数没啥问题,签名验证不通过,建议检查签名算法’。哔!
当陷入困境的时候再看看提供的demo吧(有的话😂,没有demo的那就只能继续苦逼研究了),如果你会Java说不定还能想到吧demo做成一个服务用来调用(见过这么干过的);
真相
真相是什么呢?如果没找对方向,怎么都想不到…… 那就是Byte,Byte即字节,由8位的二进制组成,然而问题就在二进制的符号位,区别如下:
C# Byte 无符号位,值域为[0~255],Java Byte 有符号位,值域为[-128~127]
转换
知道了问题所在,就很好解决了,我们知道了C#将Byte的符号位用于计算了,那么只需要将C#的Byte的符号位的值减去即可得到Java的Byte,而符号位在最高位,即2^8=256,也就是说C# Byte中的每一位如果大于等于128就减去256,否则就取当前值,这样就得出了Java的Byte值。
C# ByteTo Java Byte
if(C#Byte[i]>=128)
{
var newByte=C#Byte[i]-256;
}
Java Byte To C# Byte
if(JavaByte[i]<0)
{
var newByte=JavaByte[i]+256;
}
总结
由于C#的Byte是无符号类型,取值0~255,Java的Byte类型是有符号类型,取值位-128~127,当获取到Byte后,需要判断Byte有无符号,有符号转无符号就将小于0的值+256;无符号转有符号就将大于127的值-256;