【问题标题】:Write 32 Bit Integer To Buffer In Python在 Python 中将 32 位整数写入缓冲区
【发布时间】:2017-08-01 09:12:12
【问题描述】:

我正在尝试将 32 位整数写入字节数组(即 Node.js 缓冲区)。

据我所知,Node.js 缓冲区对象allocUnsafe 函数返回以十六进制格式编码的伪随机生成的数字数组。

所以我在 Python 中解释了 Node.js Buffer.allocUnsafe(n) 方法:

[c.encode('hex') for c in os.urandom(n)]

但是,allocUnsafe函数有自己的嵌套函数writeInt32BE(value, offset)writeInt32LE(value, offset),我已经阅读了官方文档,但是我不明白这些函数究竟返回了什么。

这些 Node.js 函数在 Python 中有没有等效的方法?据我所知,Python 中的同等动作可以使用struct 模块和from_bytes 方法来完成,但我不确定如何。提前致谢。

【问题讨论】:

    标签: python arrays node.js python-2.7 buffer


    【解决方案1】:

    Python 提供了类似int.to_bytes(size,byteorder) 的方法参见here
    因此,为了将数字转换为 32 位,我们将 to_bytes 方法中的长度设为 4,即 4*8 = 32 bits
    int.from_bytes 函数将字节转换为 int 请参阅 here

     >>> n = 512
     >>> n_byte = (n).to_bytes(4,byteorder='big')
     b'\x00\x00\x02\x00'
     >>> int.from_bytes(n_byte,byteorder='big')
     512
    

    以字节为单位的默认表示是整数的有符号表示。
    来自文档:

    >>> int.from_bytes(b'\x00\x10', byteorder='big')   16  
    >>> int.from_bytes(b'\x00\x10', byteorder='little')  4096  
    >>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=True)  
    -1024  
    >>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=False) 64512  
    >>> int.from_bytes([255, 0, 0], byteorder='big')   16711680
    

    您可以查看十六进制表示以转换为整数

    >>> hex(6)
    '0x6'  
    >>> int('0xfeedface',16)
    4277009102
    

    【讨论】:

    • 您好,感谢您的回答。抱歉,如果我误解了,但在 28 9f 04 03 01 00 00 00 04 00 的 Node.js 缓冲区上,writeUInt32BE 方法上返回 6,但在 Python 中 int.from_bytes(b'(\x9f\x04\x03\x01\x00\x00\x00\x04\x00', "big", signed=False) 返回 191827980698406220727296 参数是否输入不正确? (from_bytes 函数的第一个参数是 Node.js 的十六进制解码的缓冲区字符)。
    • @ShellRox 如果您正确阅读了文档中的方法。函数 writeUInt32BE 具有参数整数和偏移量,其中偏移量决定将表示形式放入缓冲区的位置。整数被转换为十六进制形式,并且交叉响应的字符存储在缓冲区中。 const buff = Buffer.allocUnsafe(4); buff.writeUInt32BE(16, 0); 这使得 buff <Buffer 00 00 00 10> 即存储在 Buffer 中的十六进制表示。
    • @ShellRox 您能否具体说明您面临的问题或在新的问题线程中向社区提问。由于您的问题发生了很大变化。请尝试再次阅读文档,希望对您有所帮助。 nodejs.org/api/buffer.html
    • 在文档中你可以读到一行nodejs.org/api/… 在这里你会知道你想要放入的整数将存储在未初始化的内存中,所以你会在缓冲区中看到一些随机数。
    • @ShellRox 请参阅此处以更好地理解repl.it/JrwD/4 我再清楚不过了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多