首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将负Python编组int重组为Javascript数字

将负Python编组int重组为Javascript数字
EN

Stack Overflow用户
提问于 2014-10-26 18:35:07
回答 1查看 223关注 0票数 1

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

在Python中,marshal.dumps(2)'i\x02\x00\x00\x00'marshal.dumps(-2)'i\xfe\xff\xff\xff'。这是有意义的,因为Python使用至少32位精度的两个补码来表示整数。

在我的类型记录代码中,我使用了相当于Node.js的缓冲区类(通过一个名为BrowserFS的库,而不是ArrayBuffers等等)。来读取数据。当我看到字符'i‘(即buffer.readUInt8(offset) == 105,发出下一个东西是int的信号)时,然后在下一个偏移量上调用readInt32LE来读取一个有符号的长(4个字节)。这对正数有效,但对负数有效:对于1,我得到'1',但对于'-1‘,我得到'-272777233’之类的东西。

我猜Javascript代表64位(浮点数?)的数字。因此,以下几点似乎应该有效:

代码语言:javascript
复制
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整数的原始值。此外,我认为我深深地误解了比特是如何工作的。任何想法在这里都将不胜感激。

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

  • 为什么buffer.readInt32LE对正ints有效,而不是负ints?
  • 我是否使用正确的方法来获得“最重要”或“最低”32位(即,& 0xffff0000是否以我认为的方式工作?)
  • 单独但相关:在一个实际的“长”数(即长于'-2')中,我认为有一个符号位和一个震级,我认为这个信息存储在数字的“最高”2位中(即在number & 0x000000ff?) --这是正确的思维方式吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-26 19:08:37

序列编码( sequence ef bf bd is the UTF-8 sequence for the "Unicode replacement character" ),Unicode编码器用来表示无效编码。

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

这只会对负值造成混乱,因为正值位于UTF-8的正常映射空间内,因此可以从原始字节流中得到1:1的转换。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26576491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档