2016-12-25 6 views
1

私はbignumbers(big.Intまたはより良いbig.Rat)をHex値に変換しようとしています。golangのHEXに大きな数字

マイナス0xff..xxまたは固定番号の場合、私はいつも番号の変換に問題があります。

これを行う方法はありますか?

+2

'big.Int'は、所与の塩基の文字列に数値を変換する'テキスト() '関数を有しています。 16進文字列を作成するには、 'value.Text(16)'を使います。それはあなたが望むことをするだろうか? –

答えて

2

ないあなたが問題の種類を持っていることを確認、しかしbig.Int、big.Floatとbig.Ratはfmt.Formatterインタフェースを実装するには、に変換するX X%でのprintfファミリを使用することができます16進数の文字列表現、例えば:

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

たとえば、-34の代わりにFFFFFFFFFFFFFFCAまたはFFCAを-54に設定しないでください。多分私が得なかった何か –

+0

あなたはその表現をどこで得たのか分かりませんが、少なくとも私が** C **ファミリーのすべての言語について知っているのは、サインを表すために最初のビットを犠牲にしているからです。 intsとintsを比較することができますが、内部を知りたい場合は[ここ](http://stackoverflow.com/questions/37582550/golang-twos-complement-and-fmt-printf)をチェックしてください。この場合も、大きな数字を参照して内部的にはスライスやリストに格納されるため、通常のレジスタには収まらないので、その配列の内部表現をどのように役立つかもしれません。 –

+0

-54(基数10) -36(塩基16)である。 FFCAは2の補数表現になります。多くのオブジェクトはbig.Intのように彼らは秘密のデータを格納する方法の詳細を保つのが好きです。彼らは共有したくないのではなく、ユーザーのコードを壊さずに実装を変更できるようにしたいと考えています。 –

関連する問題