Произошла ошибка: math / big: не может распаковать в * big.Int - PullRequest
4 голосов
/ 01 апреля 2019

Я пытаюсь разобрать строку json в большой int в golang.Я получаю следующую ошибку.Есть ли другой способ заставить это работать?

Произошла ошибка: математика / большой: не удается распаковать "\" 82794247871852158897004947856472973914188862150580220767211643167985440428259 \ "" в * большой. Код

1006

1006 *1006* 1006 *1006* 1006Детская площадка: https://play.golang.org/p/F5RMehTau8e

package main

import (
    "fmt"
    "math/big"
    "encoding/json"
)


type Signature struct {
    R, S *big.Int
    V, O uint8 // V is a reconstruction flag and O a multi sig order
}


func main() {

    string := []byte(`{"O":0,"R":"82794247871852158897004947856472973914188862150580220767211643167985440428259","S":"39475619887140601172207943363731402979187092853596849493781395367115389948109","V":0}`)   

    var sig Signature

    err2 := json.Unmarshal([]byte(string), &sig)
    if err2 != nil {
        fmt.Println("There was an error:", err2)
    }
    fmt.Println("r", sig.R, "s", sig.S, "o", sig.O, "v", sig.V)

}

1 Ответ

0 голосов
/ 02 апреля 2019

@ d3t0x! Пожалуйста, посмотрите на

большой # Int.SetString

Возможный путь:

package main

import (
    "encoding/json"
    "fmt"
    "math/big"
)

type Signature struct {
    R, S BigInt
    V, O uint8 // V is a reconstruction flag and O a multi sig order
}

type BigInt struct {
    big.Int
}

func (i *BigInt) UnmarshalJSON(b []byte) error {
    var val string
    err := json.Unmarshal(b, &val)
    if err != nil {
        return err
    }

    i.SetString(val, 10)

    return nil
}

func main() {
    string := []byte(`{"O":0,"R":"82794247871852158897004947856472973914188862150580220767211643167985440428259","S":"39475619887140601172207943363731402979187092853596849493781395367115389948109","V":0}`)

    var sig Signature

    err2 := json.Unmarshal([]byte(string), &sig)
    if err2 != nil {
        fmt.Println("There was an error:", err2)
    }

    fmt.Printf("r %s s %s o %d v %d", sig.R.String(), sig.S.String(), sig.O, sig.V)
}

Playgrounds:

1) https://play.golang.org/p/Qp-hiiPDfZM

2) Черновое и не очень чистое решение здесь https://play.golang.org/p/YYdf85ub5-T

...