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包进行安全的类型转换。

回到顶部