2015-01-02 31 views
1

我有這樣的代碼:如何將[]字節轉換爲[16]字節?

func my_function(hash string) [16]byte { 
    b, _ := hex.DecodeString(hash) 
    return b // Compile error: fails since [16]byte != []byte 
} 

b[]byte類型。我知道hash的長度是32.我怎樣才能讓我的代碼在上面工作? IE瀏覽器。我可以以某種方式從通用字節數組轉換爲固定長度的字節數組?我對分配16個新字節和複製數據不感興趣。

+0

就像在一個數組中複製切片一樣? http://stackoverflow.com/a/21399657/6309 – VonC

+0

不,我不喜歡複製。添加到問題。 – Ztyx

+2

沒有'unsafe'不能轉換。 slice頭部本身在amd64上是24個字節,並且在'hex.DecodeString'返回時被複制到堆棧,並且哈希本身將遠遠大於複製16字節結果的成本;我會選擇你的戰鬥,而不是太擔心這個。 – twotwotwo

回答

7

沒有直接的方法將切片轉換爲數組。你可以做一個副本。

var ret [16]byte 
copy(ret[:], b) 

標準庫使用[]字節,如果你堅持要用別的東西,你只會有更多的打字做。我爲我的md5值編寫了一個使用數組的程序,並對此表示遺憾。

+1

請注意,您通常可以通過切片數組變量(例如'foo [:]')來確保您接收的數據以數組變量結尾。當你想要出於性能原因實際使用數組時,這很有用,但是你仍然需要將Read()和Write()寫入它們。 – fuz