Golang如何从缓冲区解析出二进制数据块
Golang如何从缓冲区解析出二进制数据块 大家好!我是Go语言的新手。关于二进制大对象(blob)的文档中有从文件读取和写入blob的示例,但我该如何直接读取缓冲区中捕获的blob呢?
import (
"gocloud.dev/blob"
)
i := 0
scanner := bufio.NewScanner(conn)
for scanner.Scan() {
// newData := scanner.Bytes()
// bucket, er := blob.Reader(newData)
// bucket, err := blob.OpenBucket(context.Background(), newData)
ln := scanner.Text() // Returns 3B blob data
fmt.Println(ln)
}
更多关于Golang如何从缓冲区解析出二进制数据块的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于Golang如何从缓冲区解析出二进制数据块的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go语言中从缓冲区解析二进制数据块,可以通过bytes.Reader结合标准库的binary包来实现。以下是具体示例:
package main
import (
"bytes"
"encoding/binary"
"fmt"
)
// 定义二进制数据结构
type DataBlock struct {
ID uint32
Length uint16
Data []byte
}
func parseBinaryFromBuffer(buffer []byte) (*DataBlock, error) {
reader := bytes.NewReader(buffer)
var block DataBlock
// 按顺序解析固定长度字段
if err := binary.Read(reader, binary.LittleEndian, &block.ID); err != nil {
return nil, fmt.Errorf("failed to read ID: %v", err)
}
if err := binary.Read(reader, binary.LittleEndian, &block.Length); err != nil {
return nil, fmt.Errorf("failed to read Length: %v", err)
}
// 动态读取数据部分
block.Data = make([]byte, block.Length)
if err := binary.Read(reader, binary.LittleEndian, &block.Data); err != nil {
return nil, fmt.Errorf("failed to read Data: %v", err)
}
return &block, nil
}
func main() {
// 示例二进制数据
rawData := []byte{
0x01, 0x00, 0x00, 0x00, // ID: 1 (小端序)
0x03, 0x00, // Length: 3
0x41, 0x42, 0x43, // Data: "ABC"
}
// 从缓冲区解析
result, err := parseBinaryFromBuffer(rawData)
if err != nil {
fmt.Printf("解析失败: %v\n", err)
return
}
fmt.Printf("ID: %d\n", result.ID)
fmt.Printf("Length: %d\n", result.Length)
fmt.Printf("Data: %s\n", string(result.Data))
}
对于更复杂的二进制格式,可以使用结构体标签:
type Packet struct {
Header uint16 `binary:"header"`
Payload []byte `binary:"payload,length=4"`
CRC uint32 `binary:"crc"`
}
func parseWithStruct(buffer []byte) (*Packet, error) {
var pkt Packet
r := bytes.NewReader(buffer)
// 使用binary.Read按定义顺序读取
if err := binary.Read(r, binary.BigEndian, &pkt.Header); err != nil {
return nil, err
}
pkt.Payload = make([]byte, 4)
if err := binary.Read(r, binary.BigEndian, &pkt.Payload); err != nil {
return nil, err
}
if err := binary.Read(r, binary.BigEndian, &pkt.CRC); err != nil {
return nil, err
}
return &pkt, nil
}
如果处理网络数据流,可以结合bufio.Reader:
func readBinaryChunk(reader *bufio.Reader) ([]byte, error) {
// 先读取长度字段
lengthBytes := make([]byte, 4)
if _, err := io.ReadFull(reader, lengthBytes); err != nil {
return nil, err
}
length := binary.BigEndian.Uint32(lengthBytes)
// 根据长度读取数据块
data := make([]byte, length)
if _, err := io.ReadFull(reader, data); err != nil {
return nil, err
}
return data, nil
}
这些示例展示了如何从字节缓冲区解析二进制数据块,包括固定长度字段、动态长度字段以及网络流处理场景。

