首页 > 解决方案 > Python 中的 buf.readUInt16LE(offset) 等价物是什么

问题描述

我在 Python 中寻找这个函数的等价物(来自 node.js)

buf.readUInt16LE(偏移量)

偏移量:开始读取之前要跳过的字节数。必须满足 0 <= offset <= buf.length - 2。

返回: 从 buf 在指定偏移处以指定的字节序格式读取一个无符号的 16 位整数(readUInt16BE() 返回大字节序,readUInt16LE() 返回小字节序)。

例子:

const buf = Buffer.from([0x12, 0x34, 0x56]);

console.log(buf.readUInt16BE(0).toString(16));
// Prints: 1234
console.log(buf.readUInt16LE(0).toString(16));
// Prints: 3412
console.log(buf.readUInt16BE(1).toString(16));
// Prints: 3456
console.log(buf.readUInt16LE(1).toString(16));
// Prints: 5634
console.log(buf.readUInt16LE(2).toString(16));
// Throws ERR_OUT_OF_RANGE

标签: pythonnode.js

解决方案


我知道没有这样的功能,尽管可能有一个包可以做到这一点。使用标准库实用程序,您可以使用struct.unpackandio.BytesIO来转换和处理(二进制)缓冲区。

下面是一个示例(Python 3)。如果线条感觉有点紧凑,请道歉;我希望它仍然易于阅读。

import io
import struct

buf = io.BytesIO(bytearray([0x12, 0x34, 0x56]))

# < and > for little and big endian, H for 2-byte unsigned short.
assert format(struct.unpack(">H", buf.read(2))[0], '02x') == "1234"

# buf.seek to reset to byte 0 (1, 2) of the stream; also for file objects
buf.seek(0)
assert format(struct.unpack("<H", buf.read(2))[0], '02x') == "3412"

buf.seek(1)
assert format(struct.unpack(">H", buf.read(2))[0], '02x') == "3456"

buf.seek(1)
assert format(struct.unpack("<H", buf.read(2))[0], '02x') == "5634"

buf.seek(2)
try:
    format(struct.unpack("<H", buf.read(2))[0], '02x')
except struct.error as exc:
    assert exc.args[0] == "unpack requires a buffer of 2 bytes"
else:
    assert False, "exception failed to be raised"

iostruct模块的文档页面上的更多详细信息。


推荐阅读