Создать FILE_ID_DESCRIPTOR в Голанге
Я пытаюсь создать эту структуру в Голанге -
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_128
с и _FILE_ID_TYPE
структура здесь и здесь
typedef enum _FILE_ID_TYPE {
FileIdType,
ObjectIdType,
ExtendedFileIdType,
MaximumFileIdType
} FILE_ID_TYPE, *PFILE_ID_TYPE;
И, выполнив некоторые исследования, я обнаружил, что enum является константным в Go, но в Go у нас не может быть именованного const, поэтому, возможно, struct(?) И union являются байтовыми слайсами. Но я не мог найти то, что MaximumFileIdType
имелось ввиду и как реализовать это в Go. Заранее спасибо.
Кроме того, ссылка, что я следую.
PS - Дайте мне знать, что вопрос проголосовал. Видите ли вы отсутствие усилий? Или не понятно? Это поможет сделать более ясный вопрос
1 ответ
Вот готовый к использованию код (взято отсюда , с примененным исправлением : в репозитории установлен неправильный размер структуры, что приводит кinvalid prameter (87)
ошибка):
/*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)
сDWORD
этоsizeof(DWORD)
составляет 4 байта; в C++ перечисления представлены какuint32
слишком; иsizeof(union)
равен размеру крупнейшего члена союза, которыйFILE_ID_128
в нашем случае. размер 128-битного значения составляет 16 байт. Поэтому приведенное выше выражение можно заменить на:
4 + 4 + 16 = 24