首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Golang创建FILE_ID_DESCRIPTOR

在Golang创建FILE_ID_DESCRIPTOR
EN

Stack Overflow用户
提问于 2018-12-13 09:28:24
回答 1查看 217关注 0票数 0

我试着在戈朗建立这个结构-

代码语言:javascript
复制
typedef struct FILE_ID_DESCRIPTOR {
  DWORD        dwSize;
  FILE_ID_TYPE Type;
  union {
    LARGE_INTEGER FileId;
    GUID          ObjectId;
    FILE_ID_128   ExtendedFileId;
  } DUMMYUNIONNAME;
} FILE_ID_DESCRIPTOR, *LPFILE_ID_DESCRIPTOR;

正如您所看到的,这取决于三个的结合,其中未知的是FILE_ID_128,而另一个结构名为FILE_ID_TYPE,因此我偶然发现了,它是FILE_ID_128s,_FILE_ID_TYPE结构是这里这里

代码语言:javascript
复制
typedef enum _FILE_ID_TYPE {
  FileIdType,
  ObjectIdType,
  ExtendedFileIdType,
  MaximumFileIdType
} FILE_ID_TYPE, *PFILE_ID_TYPE;

在做了一些研究之后,我发现枚举在Go中是const但是在Go中,我们不能有一个命名的const,所以可能是一个struct(?)和联合是字节片。但是我找不到MaximumFileIdType的意思,也找不到如何在Go中实现它。提前谢谢。

还有,我正在跟踪的参考文献

EN

回答 1

Stack Overflow用户

发布于 2022-07-09 07:20:45

这里已经准备好使用代码(取自这里,并应用了fix :在repo中设置了结构的默认大小,这会导致invalid prameter (87)错误):

代码语言:javascript
复制
/*Must put file id into ID as big endian; 
little endian form will be placed in descriptor 
automatically when calling id.Descriptor()*/
type ID [16]byte 

func (id ID) Descriptor() Descriptor {
    var structType uint32
    if id.IsInt64() {
        structType = FileType
    } else {
        structType = ExtendedFileIDType
    }

    return Descriptor{
        Size: 24, // (1)
        Type: structType,
        Data: id.LittleEndian(),
    }
}

func (id ID) IsInt64() bool {
    upper := int64(id[0])<<56 | int64(id[1])<<48 | int64(id[2])<<40 | int64(id[3])<<32 | int64(id[4])<<24 | int64(id[5])<<16 | int64(id[6])<<8 | int64(id[7])
    return upper == 0
}

func (id ID) LittleEndian() (value [16]byte) {
    for i := 0; i < 16; i++ {
        value[i] = id[15-i]
    }
    return
}

type Descriptor struct {
    Size uint32
    Type uint32
    Data [16]byte
}

const (
    FileType = iota
    ObjectIDType
    ExtendedFileIDType
)

一些解释:

(1)大小必须始终为24,因为它必须等于sizeof(FILE_ID_DESCRIPTOR),计算方法如下:

sizeof(DWORD) + sizeof(enum) + sizeof(union)

由于DWORDuint32,所以sizeof(DWORD)是4个字节;在C++枚举中也表示为uint32sizeof(union)等于最大的联合成员的大小,在我们的例子中是FILE_ID_128。128位值的大小为16字节。因此,上述表达式可替换为:

4 + 4 + 16 = 24

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53758663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档