对接一个系统,要求进行位移加密,结果发现 C#和 PHP 的结果不一致,在 c# 中 3233857544>>-171,结果是 1542,在 PHP 中位移是不允许使用负数的,在 js 中可以运行,但是结果是 3233857544>>-506,因为目标结果其实是根据 C#为基准的,现在开发使用的是 PHP,导致结果不一致,双方验证失败,现在不考虑 php 的位移运算,在 php 中使用 js 代码进行位移计算,怎么能让 js 和 c#的运行结果一致呢?
1
hxnets OP 有没有大神知道怎么解决啊
|
2
Delon 2019-11-29 10:42:38 +08:00
位移负数这是什么骚操作...
|
3
chenset 2019-11-29 10:44:24 +08:00
3233857544 , 类型不对或者溢出了吧
|
4
xenme 2019-11-29 10:55:33 +08:00 3
类型问题。
JS 的默认类型是 Number 是浮点数,位移空位不填零 Zero-fill right shift a >>> b Shifts a in binary representation b (< 32) bits to the right, discarding bits shifted off, and shifting in 0s from the left. JS========== 3233857544>>>-171 1542 |
7
RHxW 2019-11-29 11:42:12 +08:00 1
右移有两种,算术右移和逻辑右移,C 中默认>>操作根据操作数类型由编译器判断采用哪种右移,基于 signed 和 unsigned
js 里应该是用>>和>>>来手动区分逻辑右移和算术右移 3233857544 算术右移-171 位( 21 位)的结果是-506,逻辑右移-171 位( 21 位)的结果是 1542 |
11
RHxW 2019-11-29 13:38:55 +08:00 1
|