douzhuoxia0587 2019-04-01 18:06
浏览 186
已采纳

发生错误:math / big:无法解组为* big.Int

I am trying to unmarshal a json string into a big int in golang. I get the following error. Is there another way to get this to work?

There was an error: math/big: cannot unmarshal "\"82794247871852158897004947856472973914188862150580220767211643167985440428259\"" into a *big.Int

Code:

Playground: 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条回答 默认 最新

  • dsux90368 2019-04-01 21:08
    关注

    @d3t0x! Please, look at the

    big#Int.SetString

    Possible way:

    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) draft and not so clean solution here https://play.golang.org/p/YYdf85ub5-T

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么