2016-12-25 4 views
1

Je suis en train de convertir bignumbers (big.Int ou encore mieux big.Rat) en valeurs hexadécimales.Grand nombre à HEX dans golang

J'ai toujours un problème de conversion quand ils sont négatifs 0xff..xx ou numéros fixes.

Y a-t-il un moyen de faire cela?

+2

'big.Int' a une fonction' Text() 'qui convertit le nombre en une chaîne dans une base donnée. Pour créer une chaîne hexadécimale, utilisez 'value.Text (16)'. Est-ce que cela fera ce que tu veux? –

Répondre

2

Je ne sais pas quel genre de questions que vous êtes avoir, mais big.Int, big.Float et big.Rat implémenter l'interface fmt.Formatter, vous pouvez utiliser la famille printf avec le % x% X à convertir représentation de chaîne hexadécimal, par exemple:

package main 

import (
    "fmt" 
    "math/big" 
) 

func toHexInt(n *big.Int) string { 
    return fmt.Sprintf("%x", n) // or %X or upper case 
} 

func toHexRat(n *big.Rat) string { 
    return fmt.Sprintf("%x", n) // or %X or upper case 
} 

func main() { 
    a := big.NewInt(-59) 
    b := big.NewInt(59) 

    fmt.Printf("negative int lower case: %x\n", a) 
    fmt.Printf("negative int upper case: %X\n", a) // %X or upper case 

    fmt.Println("using Int function:", toHexInt(b)) 

    f := big.NewRat(3, 4) // fraction: 3/4 

    fmt.Printf("rational lower case: %x\n", f) 
    fmt.Printf("rational lower case: %X\n", f) 

    fmt.Println("using Rat function:", toHexRat(f)) 
} 

https://play.golang.org/p/BVh7wAYfbF

+0

bien par exemple ne devrait pas -54 être FFFFFFFFFFFFFFCA ou FFCA au lieu de -34? peut-être quelque chose que je n'ai pas eu –

+0

pas sûr où avez-vous eu cette représentation, au moins ce que je sais pour toutes les langues de la famille ** C ** est qu'ils sacrifient le premier bit pour représenter le signe, c'est pourquoi nous avons signé Ints vs Ints, mais si vous voulez connaître les internes, vous pouvez vérifier [ici] (http://stackoverflow.com/questions/37582550/golang-twos-complement-and-fmt-printf) Aussi dans ce cas, nous ' se référant aux grands nombres et en interne ils sont stockés dans une tranche ou une liste parce qu'ils ne tiennent pas dans un registre régulier, donc je ne sais pas comment utile peut avoir la représentation interne de ce tableau –

+0

-54 (base 10) serait soit -36 (base 16). FFCA serait la représentation de complément de deux. Beaucoup d'objets aiment grand.Int aiment garder les détails de la façon dont ils stockent des données un secret. Pas parce qu'ils ne veulent pas partager mais qu'ils veulent pouvoir changer l'implémentation sans casser le code de leurs utilisateurs. –