python - Python 中的 buf.readUInt16LE(offset) 等价物是什么
问题描述
我在 Python 中寻找这个函数的等价物(来自 node.js)
偏移量:开始读取之前要跳过的字节数。必须满足 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
解决方案
我知道没有这样的功能,尽管可能有一个包可以做到这一点。使用标准库实用程序,您可以使用struct.unpack
andio.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"
推荐阅读
- reactjs - 使用 react-i18next 切换语言时列表项的奇怪行为
- node.js - 无法在 macOS Big Sur 11.4 上安装 Gulp-sass
- android - 如何在许多活动之间保存 int 值
- discord.js - MessageEmbed 字段值不能为空。不和谐.js
- python - 在python中如何替换放置在字符串和特殊字符之间的字符串
- sql - 根据两个标识符连接 Trino 中同一列的字符串
- r - lmerTest 之后的事后 emmeans() 测试出现问题
- python - 将所有包含文件的目录从 FTP 复制到本地目录
- c# - 什么是“OnDockChanged”事件处理程序?
- mongodb - 如何通过 ID 查找可以嵌套 n 级深的嵌套子文档?