Golang中如何将有符号变量转为[]byte缓冲区
Golang中如何将有符号变量转为[]byte缓冲区 你好! 我有一个 []byte 缓冲区,需要向其中插入(或从中读取)有符号值。该如何操作?
谢谢!
3 回复
抱歉! encoding/binary 正是我需要的。
(可以关闭这个主题吗?)
更多关于Golang中如何将有符号变量转为[]byte缓冲区的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
将其转换为字符串(打印出来),然后转换为字节切片,并将该字节切片放入缓冲区中。反向流程用于检索它。
在Golang中,将有符号变量转换为[]byte缓冲区可以使用encoding/binary包。以下是几种常见情况的示例:
1. 单个有符号整数转换
package main
import (
"encoding/binary"
"fmt"
)
func main() {
// 创建缓冲区
buf := make([]byte, 8)
// 将有符号int64写入缓冲区
var num int64 = -123456789
binary.LittleEndian.PutUint64(buf, uint64(num))
// 从缓冲区读取有符号int64
readNum := int64(binary.LittleEndian.Uint64(buf))
fmt.Printf("写入值: %d, 读取值: %d\n", num, readNum)
}
2. 批量转换多个有符号值
package main
import (
"bytes"
"encoding/binary"
"fmt"
)
func main() {
// 创建缓冲区
var buf bytes.Buffer
// 写入多个有符号值
values := []int16{100, -200, 300, -400}
for _, v := range values {
binary.Write(&buf, binary.LittleEndian, v)
}
// 从缓冲区读取
bufReader := bytes.NewReader(buf.Bytes())
for i := 0; i < len(values); i++ {
var readVal int16
binary.Read(bufReader, binary.LittleEndian, &readVal)
fmt.Printf("读取值: %d\n", readVal)
}
}
3. 使用结构体进行复杂数据转换
package main
import (
"encoding/binary"
"fmt"
)
type Data struct {
ID int32
Value int64
Status int16
}
func main() {
// 创建数据实例
data := Data{
ID: -1001,
Value: -9876543210,
Status: -1,
}
// 计算所需缓冲区大小
buf := make([]byte, 4+8+2) // int32 + int64 + int16
// 按顺序写入缓冲区
offset := 0
binary.LittleEndian.PutUint32(buf[offset:], uint32(data.ID))
offset += 4
binary.LittleEndian.PutUint64(buf[offset:], uint64(data.Value))
offset += 8
binary.LittleEndian.PutUint16(buf[offset:], uint16(data.Status))
// 从缓冲区读取
offset = 0
readID := int32(binary.LittleEndian.Uint32(buf[offset:]))
offset += 4
readValue := int64(binary.LittleEndian.Uint64(buf[offset:]))
offset += 8
readStatus := int16(binary.LittleEndian.Uint16(buf[offset:]))
fmt.Printf("ID: %d, Value: %d, Status: %d\n", readID, readValue, readStatus)
}
4. 处理不同字节序
package main
import (
"encoding/binary"
"fmt"
)
func main() {
var num int32 = -12345
buf := make([]byte, 4)
// 小端序
binary.LittleEndian.PutUint32(buf, uint32(num))
littleEndianVal := int32(binary.LittleEndian.Uint32(buf))
// 大端序
binary.BigEndian.PutUint32(buf, uint32(num))
bigEndianVal := int32(binary.BigEndian.Uint32(buf))
fmt.Printf("原始值: %d\n", num)
fmt.Printf("小端序读取: %d\n", littleEndianVal)
fmt.Printf("大端序读取: %d\n", bigEndianVal)
}
5. 直接内存转换(unsafe包)
package main
import (
"fmt"
"unsafe"
)
func main() {
var num int64 = -987654321
// 将有符号int64转换为[]byte
buf := (*[8]byte)(unsafe.Pointer(&num))[:]
// 从[]byte恢复有符号int64
recoveredNum := *(*int64)(unsafe.Pointer(&buf[0]))
fmt.Printf("原始值: %d, 恢复值: %d\n", num, recoveredNum)
}
注意:使用unsafe包需要谨慎,因为它绕过了Go的类型安全检查。推荐使用encoding/binary包进行安全的类型转换。

