Скопируйте определенную часть буфера BYTE в структуру+

Я работал в своем загрузчике файлов и решил, что для следующих обновлений будет лучше, чем продолжать использовать fread и fseek читать файл дыры в буфер BYTE, и я тоже, теперь мне интересно, нет ли простого способа назначения часть этого буфера BYTE в структуру.

Я уже пытался создать временный буфер того же размера, что и структура, скопировать в него все нужные мне БАЙТЫ из исходного буфера и использовать memcpy, но это не сработало, я просто получил много случайных чисел (которые я думаю, что получаю их указатели, но я не знаю правильно).

Спасибо за ваше время!

Редактировать: НАСТОЯЩИЙ код

void memread(BYTE from[],int pos, void * to,size_t size) 
{   
    BYTE * temp = new BYTE[sizeof(BYTE)*size];

    for (unsigned int i = 0; i< 1+size; i++)
        temp[i] = from[i+pos];

    memcpy(to,temp,size);

}


... inside the file loader ...


fseek(fl,0,SEEK_END);
const int memory_size = (int)ftell(fl);


BYTE * memory = new BYTE[sizeof(BYTE)*memory_size];
fseek(fl,0,SEEK_SET);

for (int i=1;i<=memory_size;i++)
fread(&memory[i],sizeof(BYTE),1,fl);

fclose(fl);

int memory_pos = 0;

XM::Memory xm;
memset(&xm,0,sizeof(XM::Memory));


memread(memory,1,&xm.Header,sizeof(XM::Header));

person user1509548    schedule 25.07.2012    source источник
comment
EDIT Обнаружил ошибку, ошибка была в функции memread, теперь я ее исправил, простите за что-либо! Исправил код, если кому интересно!   -  person user1509548    schedule 25.07.2012
comment
КСТАТИ: Это знаменитый формат Fast Tracker XM, который вы пытаетесь прочитать?   -  person huysentruitw    schedule 25.07.2012
comment
Извините за поздний ответ, да, я пытаюсь сделать полную библиотеку проигрывателя с открытым исходным кодом на С++ для форматов XM, MOD и IT, долгих лет жизни Chiptune! Я думаю, что следующая неделя готова, загрузка паттерна/канала/ряда закончена, все, что мне нужно закончить, это скорость загрузки сэмпла/инструмента и выбрать, какую библиотеку использовать для воспроизведения, я думал о WINMM или OPENAL, но я не Конечно...   -  person user1509548    schedule 26.07.2012
comment
Не хочу портить вечеринку, но Audiere — это проект LGPL, который занимается именно этим и подробнее :) Также проверьте инструмент с открытым исходным кодом DUMB (источник анализа файлов DUMB — здесь.   -  person huysentruitw    schedule 26.07.2012
comment
Ну, чем больше, тем лучше, я на самом деле планирую сделать это для использования в демонстрациях и интро, и иметь идеальную систему синхронизации, и сделать его портативным, быстрым и маленьким... ну ладно я делаю это, потому что мне вообще нечего делать, лол   -  person user1509548    schedule 26.07.2012


Ответы (1)


Сначала вы читаете файл побайтно, что снижает производительность. Затем ваш memread (где вы не освобождаете временный буфер!) можно заменить простым memcpy

fseek(fl, 0, SEEK_END); 
const int memory_size = (int)ftell(fl); 

BYTE* memory = new BYTE[sizeof(BYTE) * memory_size];
fseek(fl, 0, SEEK_SET); 

fread(memory, sizeof(BYTE), memory_size, fl); 

fclose(fl); 

int memory_pos = 0; 

XM::Memory xm;
memset(&xm, 0, sizeof(XM::Memory)); 

memcpy(&xm.Header, memory + memory_pos, sizeof(XM::Header);

Никогда не забывайте delete[] выделенные вам массивы, такие как temp и memory

person huysentruitw    schedule 25.07.2012
comment
Да неужели? Ничего себе, я не могу поверить, что ответ был так прост! Спасибо, мой друг, и у меня есть еще один вопрос. - person user1509548; 25.07.2012
comment
Внутри моей структуры у меня есть несколько СЛОВ и DWORDS, используя memcpy, он автоматически преобразует БАЙТЫ в СЛОВА и DWORDS? - person user1509548; 25.07.2012
comment
Да, но вам придется следить за выравниванием данных и последовательностью байтов. Вам придется сообщить компилятору, что вы хотите, чтобы структура была выровнена по байтам, иначе у вас возникнут проблемы. Если ф.э. файл с прямым порядком байтов, и вы читаете его как с прямым порядком байтов, все байты в WORD или DWORD должны быть заменены местами. - person huysentruitw; 25.07.2012
comment
Если вы используете компилятор MS, вы можете использовать упаковать прагму - person huysentruitw; 25.07.2012
comment
Спасибо за вашу помощь, теперь все работает нормально, я до сих пор не могу понять прагму пакета, но после прочту об этом подробнее :) - person user1509548; 25.07.2012
comment
Хорошо скажем, выравнивание установлено на 4 байта. И у вас есть структура с BYTE и DWORD, размер структуры будет 8, потому что компилятор выравнивает DWORD по границе 4 байт. Поэтому, если вы скопируете данные из файла в структуру, будет потеряно 3 байта (если в файле есть последовательные данные). В этом случае вы должны установить выравнивание на 1. Это действительно зависит от того, как файл сохранен. - person huysentruitw; 25.07.2012