当前位置: 首页 > 知识库问答 >
问题:

根据数据将缓冲区复制到类型结构中

吕寒
2023-03-14

我的要求是将字节流转换为具有预定义数据长度的结构类型。在下面的示例中,我可以将字节转换为“Test”对象并读取数据(func-buffertoStruct演示了这一点),

但问题是

我需要根据字符串或整数长度转换为数据类型。现在没有发生。

我有很多不同的结构,比如“类型测试”,每个结构都有大量的数据变量。因此,根据大小逐个将字节复制到结构测试变量中是行不通的。

我在考虑解决方案:

我正在考虑保留所有结构变量的名称、大小、数据结构中的类型以及基于此的切片字节流循环

type datadetails struct {
 name string //ex: uniqnum, guid etc
 size int  //9 ,32
 datatype string //int, string, etc int for uniqnum, string for guid
}

问:需要比这更好的解决方案吗?到目前为止,这是我的样本。

package main

import (
     "bytes"
    "encoding/gob"
    "log"
    "fmt"
)

type Test struct{
    uniqnum int64 //9 char in byte stream ex: 708008123 (int) 
    guid string //exactly is 32 -chars
    flag byte //string 1 char   
    printnum  string //6 char

}

func convertintorec(data []byte) {
    fmt.Println(data)
    //convert byte data into Test record
}
func buffertoStruct(gbuffer []byte,pobj *Test ) {
        tmp :=bytes.NewBuffer(gbuffer)
        dec := gob.NewDecoder(tmp)
        err := dec.Decode(pobj)
        if err != nil {
           log.Fatal("decode error:", err)
        }
}

func main() {
    bdata := []byte("9885455612guidstartshere12345678901234567F")
    convertintorec(bdata)
        
}

共有1个答案

单耘豪
2023-03-14

这会让你走到一半:

var ErrTooShort = errors.New("too short")

func convertintorec(data []byte) (t *Test, err error) {

    t = &Test{}

    if len(data) < 9 {
        err = ErrTooShort
        return
    }

    uniqnum := string(data[:9])
    t.uniqnum, err = strconv.ParseInt(uniqnum, 10, 64)
    if err != nil {
        err = fmt.Errorf("bad uniqnum %q: %w", uniqnum, err)
        return
    }

    data = data[9:]

    if len(data) < 32 {
        err = fmt.Errorf("gid %w", ErrTooShort)
        return
    }

    t.guid = string(data[:32])

    // t.flag / t.printnum is left to implement...

    return
}

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

 类似资料:
  • 我正在编写一个GUI,它通过OpenTK和C#上的GLControl使用OpenGL,我试图使用脏矩形来绘制需要绘制的控件。显然,仅仅为了刷新鼠标悬停按钮而重新绘制整个最大化表单是不明智的。 我的第一次尝试是使用glScissors,但这并不限制SwapBuffers,在我的平台中,我怀疑(因为性能几乎完全取决于窗口大小)不会“交换”,而是将后缓冲区的完整副本复制到前缓冲区。 第二次尝试是glAd

  • 问题内容: 我有一些二进制数据的缓冲区: 我想追加。 如何追加更多二进制数据?我正在搜索文档,但是要附加数据,它必须是字符串,否则,将发生错误( TypeError:Argument必须是string ): 然后,我在这里看到的唯一解决方案是为每个附加的二进制数据创建一个新缓冲区,并将其复制到具有正确偏移量的主缓冲区中: 但这似乎效率不高,因为我必须为每个追加实例化一个新的缓冲区。 您知道附加二进

  • 我有一个二进制数据缓冲区,我想存储在协议缓冲区中。 在留档(https://developers.google.com/protocol-buffers/docs/proto#scalar)中,它说类型等价于C中的。我无法相信这一点,所以我不得不尝试它,是的,这似乎是这样... 本协议: 给出一个包含以下内容的消息定义: 公共setter/getter API如下所示: 当然,这不是在消息中存储二

  • 本文向大家介绍数据类型和数据结构之间的区别,包括了数据类型和数据结构之间的区别的使用技巧和注意事项,需要的朋友参考一下 众所周知,编程完全围绕数据展开。数据是实现所有业务逻辑的基础,而数据流则是构成应用程序或项目功能的数据。因此,组织和存储数据以使其最优化使用并使用良好的数据模型进行有效编程就变得非常重要。 通常,数据类型和数据结构似乎都与处理数据的性质和组织相同,但是其中两个描述了数据的类型和性

  • 嗨,为了保持向后兼容性,可以更改协议缓冲区中字段的数据类型吗。例如 旧消息 所以基本上我没有更改字段的标签号,也没有重命名它,但我更改了数据类型。那么这是向后兼容的吗?如果一个应用程序获得了一个用以前的模式创建的旧proto对象,它可以通过这个新模式创建的对象进行解析吗?

  • mimeType String - 要发送的缓冲区的mimeType data Buffer - 实际的Buffer内容