我正在尝试用 Go 重新实现它几年前用 C 编写的程序
程序应该读取类似“记录”的结构化二进制文件并对记录做一些事情(对记录本身做了什么与这个问题无关)
这样的数据文件由许多记录组成,其中每个记录都有以下定义:
REC_LEN U2 // length of record after header
REC_TYPE U1 //a type
REC_SUB U1 //a subtype
REC_LEN x U1 //"payload"
我现在的问题是如何在 Go 的结构中指定可变长度 byte[]?
我的计划是使用 binary.Read 读取记录
到目前为止,这是我在 Go 中尝试过的内容:
type Record struct {
rec_len uint16
rec_type uint8
rec_sub uint8
data [rec_len]byte
}
不幸的是,我似乎无法在同一结构中引用结构的字段,因为我收到以下错误:
xxxx.go:15: undefined: rec_len
xxxx.go:15: invalid array bound rec_len
如果有任何想法能指引我正确的方向,我将不胜感激
谢谢
韩国
最佳答案
您可以阅读记录如下:
var rec Record
// Slurp up the fixed sized header.
var buf [4]byte
_, err := io.ReadFull(r, buf[:])
if err != nil {
// handle error
}
rec.rec_len = binary.BigEndian.Uint16(buf[0:2])
rec.rec_type = buf[2]
rec.rec_sub = buf[3]
// Create the variable part and read it.
rec.data = make([]byte, rec.rec_len)
_, err = io.ReadFull(r, rec.data)
if err != nil {
// handle error
}
关于struct - 高语 : Variable length array in struct for use with binary read,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28012952/
我正在构建这个图书馆应用程序,它有3个类。国家、图书馆和书籍。国家有许多图书馆,图书馆属于一个国家。图书馆有很多书,书是嵌入图书馆的。但是,当我执行此auto_pick_job时,我们到达top_free_book并调用library.state。由于某种原因,library.state为nil。我希望恢复状态但没有骰子。我调用和创建库的方式如下。所以图书馆将永远属于一个现有的国家。state=Stats.find(x)library=state.libaries.new(info)library.save_optimistic!我也很感激使用Struct的关系帮助。classStat
我正在编写一个Ruby扩展,我正在使用函数Data_wrap_struct。为了参与Ruby的标记和清除垃圾收集过程,我需要定义一个例程来释放我的结构,以及一个例程来标记从我的结构到其他结构的任何引用。我通过经典的free函数来释放内存,但我不知道如何使用标记函数。我的结构听起来像这样typedefstruct{intx;inty;}A;typedefstruct{Acollection[10];intcurrent;}B;我认为我需要一个标记函数来标记结构B的collection中的引用。谁能给我看一个例子,看看标记函数是如何工作的? 最佳答案
我在Windows上使用带有DevKit的Ruby1.9.3(在Win764位上都是32位)。现在我尝试安装rails,但从bundle中得到一个错误。如果我尝试运行(包在提示什么)geminstalljson我收到以下错误消息:D:\RubyTest>geminstalljsonTemporarilyenhancingPATHtoincludeDevKit...Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingjson:ERROR:Failedtobuildgemnativeextension.D:
我们有一个遗留代码库,其中rubocop报告了一些我永远无法理解的错误:Don'textendaninstanceinitializedbyStruct.new.Extendingitintroducesasuperfluousclasslevelandmayalsointroduceweirderrorsifthefileisrequiredmultipletimes.究竟什么是“多余的类级别”,可能会引入什么样的“怪异错误”?(问是因为显然我们在过去几年没有遇到过任何此类问题。) 最佳答案 Struct.new创建一个匿名类,它
根据thedocumentationStruct的未设置属性设置为nil:unsetparametersdefaulttonil.是否可以为特定属性指定默认值?例如,对于以下结构Struct.new("Person",:name,:happy)我希望属性happy默认为true而不是nil。我怎样才能做到这一点?如果我这样做Struct.new("Person",:name,:happy=true)我明白了-:1:syntaxerror,unexpected'=',expecting')'Struct.new("Person",:name,:happy=true)^-:1:warnin
RubyStruct允许使用一组访问器生成实例:#CreateastructurenamedbyitsconstantCustomer=Struct.new(:name,:address)#=>CustomerCustomer.new("Dave","123Main")#=>#这看起来方便且功能强大,但是,哈希的作用非常相似:Customer={:name=>"Dave",:address=>"123Main"}在哪些现实情况下我应该更喜欢Struct(以及为什么),选择其中一个有哪些注意事项或陷阱? 最佳答案 就我个人而言,当我想
我没有太多的编程经验。但是,对我来说,Struct似乎有点类似于Hash。Struct可以做什么?有没有什么Struct可以做而Hash不能做的?google了一下,Struct的概念在C中很重要,但我对C了解不多。 最佳答案 结构在以下方面不同于使用HashMap(除了代码的外观):结构具有一组固定的属性,而您将新键添加到散列。调用结构实例上不存在的属性将导致NoMethodError,而从哈希中获取不存在的键的值只会返回nil。不同结构的两个实例永远不会相等,即使结构具有相同的属性并且实例具有相同的值(即Struct.new(:
一般来说,与Struct相比,使用OpenStruct有哪些优点和缺点?哪种类型的一般用例适合其中的每一个? 最佳答案 使用OpenStruct,您可以任意创建属性。另一方面,Struct必须在您创建它时定义其属性。选择哪一个应该主要取决于您以后是否需要能够添加属性。考虑它们的方式是将它们作为一方面的哈希和另一方面的类之间的光谱的中间地带。它们暗示了数据之间比Hash更具体的关系,但它们没有类那样的实例方法。例如,一个函数的一堆选项在哈希中是有意义的;他们只是松散地相关。函数所需的姓名、电子邮件和电话号码可以一起打包在Struct或
我正在尝试在Nodejs上解析一个使用结构联合类型的缓冲区,我该如何在Nodejs上本地处理这个问题?我完全迷路了。typedefunion{unsignedintvalue;struct{unsignedintseconds:6;unsignedintminutes:6;unsignedinthours:5;unsignedintdays:15;//from01/01/2000}info;}__attribute__((__packed__))datetime; 最佳答案 这个联合要么是一个32位整数value,要么是info结构
这个问题在这里已经有了答案:Structdoesnotimplementinterfaceifithasafunctionwhichparameterimplementinterface(2个回答)2年前关闭。//BEGIN:externallibrarytyperealXstruct{}typerealYstruct{}func(realX)Do()realY{returnrealY{}}//ENDtypeAstruct{amyX}typemyYinterface{}typemyXinterface{Do()myY}funcfoo(arg1myY){}funcmain(){foo(r