为了账号安全,请及时绑定邮箱和手机立即绑定

将 Go 的 PutUint16 转换为 Python

将 Go 的 PutUint16 转换为 Python

Go
婷婷同学_ 2022-05-10 17:13:22
我想在 Python 中获得下面给出的 Go 代码的等价物:func Make(op Opcode, operands ...int) []byte {    def, ok := definitions[op]    if !ok {        return []byte{}    }    instructionLen := 1    for _, w := range def.OperandWidths {        instructionLen += w    }    instruction := make([]byte, instructionLen)    instruction[0] = byte(op)    offset := 1    for i, o := range operands {        width := def.OperandWidths[i]        switch width {        case 2:            binary.BigEndian.PutUint16(instruction[offset:], uint16(o))        case 1:            instruction[offset] = byte(o)        }        offset += width    }    return instruction}func ReadOperands(def *Definition, ins Instructions) ([]int, int) {    operands := make([]int, len(def.OperandWidths))    offset := 0    for i, width := range def.OperandWidths {        switch width {        case 2:            operands[i] = int(ReadUint16(ins[offset:]))        case 1:            operands[i] = int(ReadUint8(ins[offset:]))        }        offset += width    }    return operands, offset}op以上是任何一个:type Opcode byteconst (    OpConstant Opcode = iota    OpAdd    OpPop    OpSub    OpMul    OpDiv)上面的代码来自《用 Go 编写编译器》一书,可以在这里找到我不太确定这里发生了什么字节转换和打包,但为了更好地理解它,我正在用 Python 编写整个内容。有人可以帮我用 Python 翻译这两个函数吗?
查看完整描述

1 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

您可以使用整数的to_bytes方法。o.to_bytes(2, byteorder='big')将产生与 相同的效果PutUint16。同样int.from_bytes可用于读取。还有struct.pack以格式字符串的方式处理类似的事情。

与在 Go 代码中所做的那样构建缓冲区并写入偏移量不同,简单地使用+附加到bytes以空开头的 a 会更有意义。


查看完整回答
反对 回复 2022-05-10
  • 1 回答
  • 0 关注
  • 248 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信