Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将负Python封送整型重新组装为Javascript数字_Javascript_Python_Typescript_Bit Manipulation_Number Formatting - Fatal编程技术网

将负Python封送整型重新组装为Javascript数字

将负Python封送整型重新组装为Javascript数字,javascript,python,typescript,bit-manipulation,number-formatting,Javascript,Python,Typescript,Bit Manipulation,Number Formatting,我正在为一个类项目用Javascript编写一个客户端Python字节码解释器,特别是Typescript。解析字节码一直很顺利,直到我尝试了一个负数 在Python中,marshal.dumps2给出“i\x02\x00\x00\x00”,marshal.dumps-2给出“i\xfe\xff\xff”。这是有意义的,因为Python使用2的补码表示整数,精度至少为32位 在我的Typescript代码中,我通过一个名为BrowserFS的库使用Node.js的缓冲区类的等价物,而不是Arra

我正在为一个类项目用Javascript编写一个客户端Python字节码解释器,特别是Typescript。解析字节码一直很顺利,直到我尝试了一个负数

在Python中,marshal.dumps2给出“i\x02\x00\x00\x00”,marshal.dumps-2给出“i\xfe\xff\xff”。这是有意义的,因为Python使用2的补码表示整数,精度至少为32位

在我的Typescript代码中,我通过一个名为BrowserFS的库使用Node.js的缓冲区类的等价物,而不是ArrayBuffers等来读取数据。当我看到字符'I',即buffer.readUInt8offset==105,表示下一个是int,然后在下一个偏移上调用readInt32LE,读取一个小的尾端有符号长4字节。这适用于正数,但不适用于负数:对于1,我得到'1',但是对于'-1',我得到类似'-27277233'的结果

我猜Javascript用64位浮点表示数字?。因此,似乎以下方法应该有效:

var longval = buffer.readInt32LE(offset); // reads a 4-byte long, gives -272777233 
var low32Bits = longval & 0xffff0000; //take the little endian 'most significant' 32 bits
var newval = ~low32Bits + 1; //invert the bits and add 1 to negate the original value
//but now newval = 272826368 instead of -2
我尝试了很多不同的方法,我已经坚持了好几天了。我不知道如何使用Javascript/Typescript从二进制封送字符串恢复Python整数的原始值。我还认为我对bits的工作原理有着深刻的误解。如果您有任何想法,我们将不胜感激

一些更具体的问题可能是:

为什么buffer.readInt32LE适用于正整数而不是负整数? 我是否使用正确的方法获取“最高有效”或“最低”32位,即&0xffff0000是否按照我认为的方式工作? 独立但相关:在实际的“长”数字中,即长于“-2”,我认为存在符号位和幅值,并且我认为该信息存储在数字的“最高”2位,即在数字&0x000000ff处这是正确的思考方式吗? 序列ef bf bd,Unicode编码器用于表示无效编码

听起来,无论您使用什么方法下载数据,都会意外地通过UTF-8解码器运行,并破坏原始数据流。确保您使用的是blob而不是文本,或者与您下载字节码的方式类似的任何东西


只有负值才会出错,因为正值在UTF-8的正常映射空间内,因此会从原始字节流转换为1:1。

真正精简版本的BrowserFS代码适用于负值。您能否将调用readUInt8的输出发布四次,以验证您正在读取预期的序列FE FF FF FF?这是问题的一大部分-我没有得到预期的序列。相反,对于-2,我得到:ef-bf-efbd-efbd-efbd-efbd-efbd-efbd-ef-bf-efbd-efbd-ef-bf-efbd-ef-bd-ef-bd-ef-bd-ef-bd-ef-bd。我不认为有任何合理的按位操作序列可以将EF-BF-BD-EF转换为-2。问题是,我正在用编译的字节码测试a=2,b=-2等几个数字。正数是正确的,整个代码对象结构也是正确的。唯一不正确的是负数值。所以我不知道怎样才能在不把其他事情弄糟的情况下改变我在流中阅读的位置。哇,我肯定应该先检查一下,然后再进行上述繁琐的操作。谢谢。如果你碰巧在GitHub或其他地方发布了你的代码,你能在这里发表评论吗?我是TypeScript团队的成员,我们一直在寻找更大/有趣的代码库,用于分析和回归测试。我会问我的教授是否可以公开存储库并让您知道