2016-12-25 20 views
1

나는 bignumbers (big.Int 또는 더 큰 big.Rat)를 16 진수 값으로 변환하려고합니다.golang의 16 진수로 큰 숫자

나는 항상 음수 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

예를 들어 -54가 -34 대신 FFFFFFFFFFFFFFCA 또는 FFCA가 아니어야합니다. 어쩌면 내가 얻지 못했던 어떤 것 –

+0

당신이 그 표현을 어디에서 얻었는지 모르겠지만 적어도 ** C ** 가족의 모든 언어에 대해 알고있는 것은 기호를 나타내는 첫 번째 비트를 희생한다는 것입니다. 그래서 우리는 서명을하지 않은 것입니다 ints 대 ints하지만 내부를 알고 싶다면 [여기] (http://stackoverflow.com/questions/37582550/golang-twos-complement-and-fmt-printf)를 확인하십시오.이 경우에도 우리는 ' 큰 숫자를 참조하고 내부적으로 그들은 슬라이스 나리스트에 저장됩니다. 왜냐하면 정규 레지스터에 맞지 않기 때문에 그 배열의 내부 표현을 갖는 것이 얼마나 유용한 지 알 수 없습니다. –

+0

-54 (기준 10) -36 (기준 16). FFCA는 2의 보수 표현입니다. 많은 객체는 big.Int처럼 그들이 어떻게 데이터를 비밀을 저장의 세부 정보를 유지하고 싶습니다. 공유하고 싶지는 않지만 사용자 코드를 위반하지 않고 구현을 변경할 수 있기를 원하기 때문입니다. –