

[]uint の変数を、[]byte に変換したいです。  
何か良い解決方法はありませんか…？


CC BY-SA 3.0
2017-07-01T05:04:17.393
36014
2017-07-28T08:16:05.030
24148
question
go
Golangでの[]uintから[]byteへの変換


質問の内容が不明確なのでその結果次第で回答が異なります。

# uint のスライスの中身をダウンキャストして byte のスライスにしたい

nobonobo さんの仰る様にループで変換して下さい

[code]

    package main
    
    import (
        "fmt"
    )
    
    func UintSliceToByteSlice(us []uint) []byte {
        b := make([]byte, len(us))
        for i, v := range us {
            b[i] = byte(v)
        }
        return b
    }
    
    func main() {
        u := []uint{1,2,3}
    
        b := UintSliceToByteSlice(u[:])
        fmt.Println(b)
    }
    
[/code]

結果は 1,2,3,4 の byte 型スライスになります。

# uint のスライス内容をメモリブロックとして byte のスライスに変換したい

エンディアンに依存します。uint (uint32 or
uint64)がメモリ上にどの様に格納されているかで結果が異なります。以下はネットワークバイトオーダーとして使われるビッグエンディアンの場合の例です。

[code]

    package main
    
    import (
        "bytes"
        "encoding/binary"
        "fmt"
        "log"
    )
    
    func main() {
        u := []uint{1,2,3,4}
    
        var buf bytes.Buffer
        for _, v := range u {
            err := binary.Write(&buf, binary.BigEndian, uint32(v))
            if err != nil {
                log.Fatal(err)
            }
        }
        fmt.Println(buf.Bytes())
    }
    
[/code]

結果は `[0 0 0 1 0 0 0 2 0 0 0 3 0 0 0 4]` になります。uint
はプラットフォームによりサイズが変わりますので始めからサイズを決め打ちできるのならば以下の様に書く事が出来ます。

[code]

    package main
    
    import (
        "bytes"
        "encoding/binary"
        "fmt"
        "log"
    )
    
    func main() {
        u := []uint32{1,2,3,4}
    
        var buf bytes.Buffer
        err := binary.Write(&buf, binary.BigEndian, u)
        if err != nil {
            log.Fatal(err)
        }
        fmt.Println(buf.Bytes())
    }
    
[/code]


CC BY-SA 3.0
2017-07-28T08:16:05.030
36744
2017-07-28T08:16:05.030
440
36014
answer