为了账号安全,请及时绑定邮箱和手机立即绑定

将 uint32 的字节附加到字节切片?

将 uint32 的字节附加到字节切片?

Go
qq_笑_17 2023-07-17 16:46:28
如果我有一个现有的,向其[]byte附加一个或多个值的字节的推荐方法是什么?uint32例如,我应该// ???用什么替换:s := []byte{0x00, 0x01, 0x02, 0x03}u := uint32(0x07060504)// ???fmt.Println(s)  // Should print [0 1 2 3 4 5 6 7]编辑:一种选择是s = append(s, byte(u)); s = append(s, byte(u >> 8)); s = append(s, byte(u >> 16)); s = append(s, byte(u >> 24)),但是有没有更惯用的方法来做到这一点?也许使用包二进制和/或包字节?
查看完整描述

3 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

一种选择是按照问题中的建议附加各个字节。多个append调用可以合并为一个调用:


s = append(s, byte(u), byte(u>>8), byte(u>>16), byte(u>>24))

二进制包也可以按照问题所示使用:


var b [4]byte

binary.LittleEndian.PutUint32(b[:], u)

s = append(s, b[:]...)

在 Go 游乐场上运行它。


最后一个片段应该b在堆栈上分配。如果没有,则可以使用以下代码避免额外的堆分配:


s = append(s, "    "...) // append four bytes (the values don't matter)

binary.LittleEndian.PutUint32(s[len(s)-4:], u) // overwrite those bytes with the uint32


查看完整回答
反对 回复 2023-07-17
?
噜噜哒

TA贡献1784条经验 获得超7个赞

编码/二进制具有您需要的功能:


import "encoding/binary"


b := make([]byte,4)

binary.LittleEndian.PutUint32(b, u)

s = append(s, b)


查看完整回答
反对 回复 2023-07-17
?
绝地无双

TA贡献1946条经验 获得超4个赞

有不安全的(实际上是安全的,如果你只复制它的字节)方法来获取任何原语的字节表示:


const sizeUInt32 = int(unsafe.Sizeof(uint32(0)))


func GetBytesUInt32(i *uint32) []byte {

   return (*[1 << 30]byte)(unsafe.Pointer(i))[:sizeUInt32:sizeUInt32]

}

https://play.golang.org/p/WPC5jeYLDth


创建的切片将携带传递的 int 存储,因此通过对其进行操作,请记住 uint32 值也将被更改。


嘿,没有讨论怎么讨厌?我意识到你们不喜欢不安全的代码,而且我意识到这样的答案不适合recommended way哪个主题启动器寻找......但我认为像 stackoverflow 这样的地方应该提供所有可能的方法来实现人们在谷歌上搜索的东西。


查看完整回答
反对 回复 2023-07-17
  • 3 回答
  • 0 关注
  • 180 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号