2017-10-17 37 views
1

Y at-il un moyen de convertir une chaîne (qui est essentiellement un nombre énorme) de la chaîne à Big int dans Go?chaîne de gros Int dans Go?

J'ai essayé d'abord le convertir en octets tableau

array := []byte(string)

convertir ensuite le tableau en BigInt.

Je pensais que cela a fonctionné, mais la sortie était différente de l'entrée d'origine. Donc je devine que la conversion n'a pas fait la bonne chose pour une raison quelconque. Les numéros auxquels je suis confrontés ont plus de 300 chiffres, donc je ne pense pas que je puisse utiliser les int normaux.

Des suggestions de quelle est la meilleure approche pour cela?

Répondre

6

Package big

import "math/big"

func (*Int) SetString

func (z *Int) SetString(s string, base int) (*Int, bool)

SetString définit z de la valeur de s, interprété à la base donnée, et rendements z et une valeur booléenne indiquant la réussite . La chaîne entière (pas juste un préfixe) doit être valide pour le succès. Si SetString échoue, la valeur de z est indéfinie mais la valeur renvoyée est nulle.

L'argument de base doit être 0 ou une valeur comprise entre 2 et MaxBase. Si la base est 0, le préfixe de chaîne détermine la base de conversion réelle. Un préfixe de "0x" ou "0X" sélectionne la base 16; le « 0 » préfixe sélectionne base 8, et un préfixe « 0b » ou « 0B » sélectionne la base 2. Sinon, la base choisie est 10.

Par exemple,

package main 

import (
    "fmt" 
    "math/big" 
) 

func main() { 
    n := new(big.Int) 
    n, ok := n.SetString("314159265358979323846264338327950288419716939937510582097494459", 10) 
    if !ok { 
     fmt.Println("SetString: error") 
     return 
    } 
    fmt.Println(n) 
} 

Playground: https://play.golang.org/p/ZaSOQoqZB_

sortie:

314159265358979323846264338327950288419716939937510582097494459 
1

Voir Example pour la conversion de chaîne en grand int.

package main 


import (
    "fmt" 
    "log" 
    "math/big" 
) 

func main() { 
    i := new(big.Int) 
    _, err := fmt.Sscan("18446744073709551617", i) 
    if err != nil { 
     log.Println("error scanning value:", err) 
    } else { 
     fmt.Println(i) 
    } 
} 

sortie:

18446744073709551617