Article details

Dart的位运算和JavaScript的位运算的区别

nano71.com
2024/2/29 17:39:31
0 comments
163 views

今天收到有同学反馈桂工助手登录不了了, 总提示密码错误, 这时隐约意识到, 登录接口肯定是换了的; 当时下午4点多, 我还在东莞同沙公园那骑车, 收到反馈后又绕了一圈就匆匆忙忙的回去开电脑查查啥情况

后面看到那个登录接口的password字段已经从明文密码更新到多层MD5二次编码
然后又发现这个多层MD5编码用到了一些有位移的特别hashMD5算法, 比如binl2rstr,binl_md5等

后面从页面提取md5.js, 去js转dart进行测试的时候, 看这编码的结果好像不太一样😓😓😓

比如JavaScript的:

console.log(-1133461296 >>> 15) //输出: 96481
console.log(1087932632 << 7) //输出: 1816423424

和Dart的:

print(-1133461296 >>> 15); // 输出: 562949953386721
print(1087932632 << 7); // 输出: 139255376896

这结果也差太多了吧😵😵😵

后面去Dart的老家:Google 查资料才知道

Js的>> <<运算符通常将操作数视为32位带符号整数, 而Dart的会对位移的目标进行类型检查和类型转换 Js的>>> <<<运算符会将操作数的二进制表示右/左移指定的位数, 同时用零填充, Dart的实际上是算术右移运算符, 它将操作数的二进制表示右/左移指定的位数, 同时用符号位填充另一侧

然后如何才能让Dart的和Js结果一样呢?

1.无符号位移, 又叫零填充位移运算符>>> <<<:

使用位掩码 0xFFFFFFFF 来强制将 value 视为无符号整数, 然后执行位移操作, 得到了与 JavaScript 相同的结果

int value = -1133461296;
int shiftAmount = 15;
int result = (value & 0xFFFFFFFF) >> shiftAmount;
print(result); // 输出: 96481

2.算术位移运算符>> <<:

上面说到了, Js的算术位运算符通常将操作数视为32位带符号整数, 因此, 对结果执行.toSigned(32)以精确地得到Js上的位移运算结果

int value = 1087932632;
int shiftAmount = 7;
int result = (value  >> shiftAmount).toSigned(32);
print(result); // 输出: 1816423424, 和Js上的一样

完美解决这小问题, 刚好周末的最后几个小时, 顺便给桂工助手发布个更新🤣🤣🤣

nano71.com
2024/2/29 17:39:31
0 comments
163 views
Welcome to myBlog-site
Recent
Category
Guestbook
2026/3/10 16:11:31

解决 Dify 数据库插件连接 SQL Server 2008/2012 报错 DB-Lib error message 20002, severity 9

(pymssql.exceptions.OperationalError) (20002, b'DB-Lib error message 20002, severity 9:\nAdaptive Server connection failed (192.168.0.223)\nDB-Lib error message 20002, severity 9:\nAdaptive Server connection failed (192.168.0.223)\n') (Background on this error at: https://sqlalche.me/e/20/e3q8)

view
coverImage
2025/8/21 15:53:02

代码还原 Pinia 官网上的那个可以互动的小菠萝

眨眼 眼球跟随鼠标 一定时间鼠标不移动眼球归位

view
coverImage
2025/5/20 13:58:34

JDBC速成

JDBC(Java Database Connectivity)是 Java 官方提供的一套 API,集成在 java.sql 和 javax.sql 包中 JDBC 允许 Java 程序连接和操作各种关系型数据库,如 MySQL、Oracle、PostgreSQL、SQL Server 等

view
coverImage
2024/11/25 13:34:21

Node.js实现一个数据缓存服务器

需求场景 公司的数据服务器每次更新部署时,会有一个服务不可用的时间以及服务重新启动的时间,但如果恰巧这段时间有用户进行访问。。。当然,这只适应于非即时性的数据

view
coverImage
2024/7/18 19:30:34

Go的高并发实现:多协程和任务队列设计

前言 随着大学生活的结束,我入职了浙江的一家属于电气制造业的公司,岗位是数据分析,我算是暂时脱离了互联网这一行业,以后可能就很少接触Web开发了;把曾经对Web电子邮件系统中的性能优化的一部分抽出来记录下,也算在表达我对Web后端开发的一种敬意了

view
coverImage
2024/4/25 18:07:59

针对SPA网站的SEO方式探索-2

前言 针对SPA网站,本文将使用Nginx+Express+Puppeteer实现一个高效的SEO工具,大致的实现思路为:Nginx判断UA再进行代理转发,Express负责监听转发的请求,Puppeteer接到Express命令后启动一个无用户界面的Chrome对目标页面进行访问,等待目标SPA页面加载完成后,再返回完整的HTML给爬虫

view
coverImage
loading-GIF