2011-08-05 2 views

답변

5

미리 정의 된 Go int 유형 크기는 구현에 따라 32 비트 또는 64 비트 (Numeric types)입니다.

다음은 빅 엔디안 intbyte (uint8 초)으로 변환하는 예입니다.

package main 

import (
    "encoding/binary" 
    "fmt" 
    "reflect" 
) 

func IntsToBytesBE(i []int) []byte { 
    intSize := int(reflect.TypeOf(i).Elem().Size()) 
    b := make([]byte, intSize*len(i)) 
    for n, s := range i { 
     switch intSize { 
     case 64/8: 
      binary.BigEndian.PutUint64(b[intSize*n:], uint64(s)) 
     case 32/8: 
      binary.BigEndian.PutUint32(b[intSize*n:], uint32(s)) 
     default: 
      panic("unreachable") 
     } 
    } 
    return b 
} 

func main() { 
    i := []int{0, 1, 2, 3} 
    fmt.Println("int size:", int(reflect.TypeOf(i[0]).Size()), "bytes") 
    fmt.Println("ints:", i) 
    fmt.Println("bytes:", IntsToBytesBE(i)) 
} 

출력 :

int size: 4 bytes 
ints: [0 1 2 3] 
bytes: [0 0 0 0 0 0 0 1 0 0 0 2 0 0 0 3] 

또는

int size: 8 bytes 
ints: [0 1 2 3] 
bytes: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 3] 
+1

내가 훨씬 덜 복잡 예를 기대하고 있었다 (때문에 내 블라인드로는 이동이 작업의 이러한 종류의 루틴의 일종을 가지고 있다고 생각합니다). 그러나 당신의 본보기는 저에게 완벽하게 잘되었습니다. 감사합니다. – oddy

+2

'int'타입은 32 비트로 보장되지 않는다. 이는 구현에 따라 다릅니다. 현재 Go 컴파일러는 모두 가지고 있지만, 언어 명세에서는 그것을 요구하지 않으므로'uint32'로 변환 할 때 조심해야합니다. * 데이터 손실이있을 수 있습니다. – jimt

+0

명시 적으로 크기가 정해진 정수를 사용할 때 성가신 코드를 적게 쓰는 것도 가능합니다. 바이너리 .BigEndian.PutUint32를 루프에서 호출하는 대신 binary.Write를 사용할 수 있습니다. –

관련 문제