Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 如何在registry.GetValue中将[]字节用作缓冲区?_Go_Registry_Bytebuffer - Fatal编程技术网

Go 如何在registry.GetValue中将[]字节用作缓冲区?

Go 如何在registry.GetValue中将[]字节用作缓冲区?,go,registry,bytebuffer,Go,Registry,Bytebuffer,GetValue()注册表包中的文档说明: GetValue检索与开放键k关联的指定值的类型和数据。它填充缓冲区buf,并返回检索到的字节计数n。如果buf太小,无法容纳存储值,它将返回ErrShortBuffer error以及所需的缓冲区大小n。如果未提供缓冲区,则返回true和实际缓冲区大小n。如果未提供缓冲区,则GetValue仅返回值的类型。如果该值不存在,则返回的错误为ErrNotExist GetValue是一个低级函数如果值的类型已知,请使用相应的Get*value函数。” 在我

GetValue()
注册表包中的文档说明:

GetValue检索与开放键k关联的指定值的类型和数据。它填充缓冲区buf,并返回检索到的字节计数n。如果buf太小,无法容纳存储值,它将返回ErrShortBuffer error以及所需的缓冲区大小n。如果未提供缓冲区,则返回true和实际缓冲区大小n。如果未提供缓冲区,则GetValue仅返回值的类型。如果该值不存在,则返回的错误为ErrNotExist

GetValue是一个低级函数如果值的类型已知,请使用相应的Get*value函数。”


在我的例子中,我不知道注册表项的值类型。但是,我只需要将值打印为字符串。
GetValue()
接受值名称和“buffer”,但buffer的类型是[]byte。它不是通过引用传递的,所以我不能只创建
var buf[]字节
,传入并读取它。我不能用
&buf
类型*[]字节
)传入它。我不能使用
字节。缓冲区
(还有类型不匹配)。我觉得我缺少了一些非常简单的东西

代码:


我想您提到的注册表API是Windows注册表。要使用这类API,您必须对调用的输出大小进行最佳猜测:

buf:=make([]byte,1024)
typ, n, e := myKey.GetValue(valuename, buf)
if e==ErrShortBuffer {
   // Go back, try with a larger buffer size
   buf=make([]byte,n)
   typ, n, e = myKey.GetValue(valuename, buf)
}

这仍然打印为空白:
typ:4
n:4
err==nil:true
buf:
一个片包含对数组的引用,因此GetValue可以将值放入传入的片中。可能您返回的数据不能作为字符串打印?类型4是什么?@WarBro使用fmt.Printf(“值:%x\n”,但[:n])查看数据。可能有不可打印的字节。如果返回的是DWORD,则需要对其进行解码。根据值的编码,使用编码/二进制包、BigEndian或LittleEndian,并将其解码为int32。是的,需要根据类型对这些字节进行解码和解释。”它不是通过引用传递的,所以我不能只创建var buf[]字节,传入并读取它”-是的,这正是您需要做的,但您需要使用
make
以大小初始化它(这是大多数引用的文档所谈论的)。
buf:=make([]byte,1024)
typ, n, e := myKey.GetValue(valuename, buf)
if e==ErrShortBuffer {
   // Go back, try with a larger buffer size
   buf=make([]byte,n)
   typ, n, e = myKey.GetValue(valuename, buf)
}