Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 是否将uint32的字节附加到字节片?_Go_Binary_Byte_Slice_Endianness - Fatal编程技术网

Go 是否将uint32的字节附加到字节片?

Go 是否将uint32的字节附加到字节片?,go,binary,byte,slice,endianness,Go,Binary,Byte,Slice,Endianness,如果我有一个现有的[]字节,建议如何将一个或多个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,字节(u));s=追加(s,字节(u>>8));s=追加(s,字节(u>>16));s=append(s,

如果我有一个现有的
[]字节
,建议如何将一个或多个
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,字节(u));s=追加(s,字节(u>>8));s=追加(s,字节(u>>16));s=append(s,byte(u>>24))
,但是有没有更惯用的方法呢?也许使用和/或?

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

import "encoding/binary"

b := make([]byte,4)
binary.LittleEndian.PutUint32(b, u)
s = append(s, b)

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

import "encoding/binary"

b := make([]byte,4)
binary.LittleEndian.PutUint32(b, u)
s = append(s, b)

一个选项是按照问题中的建议附加各个字节。多个
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[:]...)

最后一个代码段应该在堆栈上分配
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

一个选项是按照问题中的建议附加各个字节。多个
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[:]...)

最后一个代码段应该在堆栈上分配
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
有一种不安全(实际上是安全的,如果您只复制它的字节)的方法来获取任何原语的字节表示:

const sizeUInt32=int(unsafe.Sizeof(uint32(0)))
func GetBytesUInt32(i*uint32)[]字节{
return(*[1有一种不安全(实际上是安全的,如果您只复制它的字节)的方法来获取任何原语的字节表示:

const sizeUInt32=int(unsafe.Sizeof(uint32(0)))
func GetBytesUInt32(i*uint32)[]字节{

return(*[1谢谢。是否有一个不需要创建临时切片的函数?我不知道。您可以创建更大的初始切片,如果这是一个选项:
s:=[]字节{0,1,2,3,0,0,0,0,0}二进制。LittleEndian.PutUint32(s[3:],u)
谢谢。有没有一个不需要创建临时片的函数可以这样做?我不知道。如果有选择的话,您可以创建更大的初始片:
s:=[]字节{0,1,2,3,0,0,0,0,0}二进制。LittleEndian.PutUint32(s[3:],u)