【问题标题】:How can I convert from []byte to [16]byte?如何从 []byte 转换为 [16]byte?
【发布时间】:2015-01-02 19:35:50
【问题描述】:

我有这个代码:

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 个新字节并复制数据不感兴趣。

【问题讨论】:

  • 就像将切片复制到数组一样? stackoverflow.com/a/21399657/6309
  • 没有。我宁愿不复制。将其添加到问题中。
  • 没有unsafe 就不能转换。切片头本身在 amd64 上是 24 字节,并在 hex.DecodeString 返回时被复制到堆栈中,并且散列本身将远比复制 16 字节结果昂贵得多;我会选择你的战斗,而不是太担心这个。

标签: go


【解决方案1】:

没有将切片转换为数组的直接方法。但是,您可以进行复制。

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

标准库使用 []byte,如果您坚持使用其他内容,您将需要进行更多输入。我为我的 md5 值编写了一个使用数组的程序并后悔了。

【讨论】:

  • 请注意,您通常可以通过对数组变量进行切片(例如foo[:])来确保接收到的数据最终出现在数组变量中。当您出于性能原因想要实际使用数组但仍想将 Read()Write() 放入其中时,这很有用。
猜你喜欢
  • 2016-01-29
  • 2011-06-08
  • 1970-01-01
  • 2018-03-25
  • 2016-12-04
  • 1970-01-01
  • 2021-08-26
  • 2014-07-21
  • 1970-01-01
相关资源
最近更新 更多