Создать 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

Другие вопросы по тегам