Python中的特殊JS运算符

1 投票
2 回答
674 浏览
提问于 2025-04-16 20:35

我正在“破解”我的路由器,需要重写一个JavaScript函数,这个函数的作用是把十六进制格式的日期转换成“年 月 日”的格式。

这个JavaScript代码看起来是这样的:

return [(((n >> 16) & 0xFF) + 1900), ((n >>> 8) & 0xFF), (n & 0xFF)];

这里的 n 是一个变量,格式是0x123456(比如说0x后面有6个十六进制数字)。我发现Python有像 >> 这样的操作符,但没有 >>> 这个操作符。

你有什么想法可以实现这个功能吗?谢谢!

2 个回答

5

使用 >> 这个符号。反正你已经通过 & 0xFF 去掉了符号。注意,你不能省略 & 这一部分,也就是说,(n >> 8) & 0xff 这个写法是必须的,否则你会得到错误的结果,正如你已经提到的那样。

3

首先,你需要知道的是,JavaScript中的位运算符是针对32位的数据进行操作的。而在Python中,它假设数据可以有无限多的位数。

在JavaScript中,'>>'被称为带符号右移,它的效果应该等于

def right_shift(data, bits):
    sign = (data >> 31) & 1 
    if sign:
       fills = ((sign << bits) - 1) << (32 - bits)
    else:
       fills = 0
    return ((data & 0xffffffff) >> bits) | fills

而'>>>'在JavaScript中被称为零填充右移。在Python中,由于它总是用零填充,所以你可以直接使用'>>'。为了确保结果和JavaScript一致,还有一种更稳妥的方法

def zero_fill_right_shit(data, bits):
    return (data & 0xffffffff) >> bits

撰写回答