Преобразование PutUint16 Go в Python - PullRequest
0 голосов
/ 01 февраля 2020

Я хочу получить эквивалент Go кода, указанного ниже в Python:

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 byte

const (
    OpConstant Opcode = iota

    OpAdd

    OpPop

    OpSub
    OpMul
    OpDiv
)

Код выше взято из книги «Написание компилятора» в Go и может быть найден здесь

Я не совсем уверен в том, что здесь происходит с преобразованиями байтов и упаковкой, но для того, чтобы понять Лучше я все это напишу в Python. Может кто-нибудь помочь мне перевести эти две функции в Python?

1 Ответ

1 голос
/ 01 февраля 2020

Вы можете использовать метод целых чисел to_bytes . o.to_bytes(2, byteorder='big') даст тот же эффект, что и PutUint16. Аналогично int.from_bytes может использоваться для чтения. Существует также struct.pack , который обрабатывает подобные вещи в виде строки формата.

Вместо построения буфера и записи в смещения, как это сделано в коде Go, имеет смысл использовать + для добавления к bytes, который начинается пустым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...