Бинарный файл Vala для структуры, подобной используемой c fread

Я пытаюсь преобразовать непосредственно из двоичного файла в структуру. На c могу сделать, а на валу не знаю как. Я помещаю примеры кода C и Vala ниже.


struct Header
{
    char name[30]; // PK2 internal name
    uint32_t version; // version
    uint8_t encryption; // does have encryption?
    uint8_t verify[16]; // used to test the blowfish key
    uint8_t reserved[205]; // unused
};

read_count = fread(&m_header, 1, sizeof(Header), m_file);
    if(read_count != sizeof(Header))
    {
        fclose(m_file);
    }

Я пытаюсь сделать то же самое с валой. Но я никогда этого не делал.

struct Header
{
    char  Header[30];          //JoyMax File Manager!
    uint    Version;        //0x02000001
    uint8    Encrypted;
    uint8  Verify[16];          // Used to test the blowfish key
    uint8  reserved[205];        // Unused
}

void main()
{
    var file = FileStream.open ("file.bin","r+");

    char name[30] = {0};
    file.gets (name);
    print((string)name);
}

Есть ли способ конвертировать из файла в структуру напрямую, как fread?


person SDClowen    schedule 16.09.2019    source источник


Ответы (1)


Вы можете преобразовать свою структуру в uint8[], а затем вызвать File.read следующим образом:

void main()
{
    var file = FileStream.open ("file.bin","r+");

    Header header = new Header ();
    file.read ((uint8[]) header);
    stdout.printf ((string) header.Header);                                                                                                                                                                       
}

Отказ от ответственности: очевидно, что это не очень безопасный код, и printf будет работать только с правильно завершающимся нулем членом Header.

person Jens Mühlenhoff    schedule 16.09.2019