我正在为一个类项目用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位(浮点数?)的数字。因此,以下几点似乎应该有效:
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?& 0xffff0000是否以我认为的方式工作?)number & 0x000000ff?) --这是正确的思维方式吗?发布于 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的转换。
https://stackoverflow.com/questions/26576491
复制相似问题