Столкнулся с dat-файлом, склеенным из полноценных wav-файлов.
При это в его (файла) начале описаны адреса начала/конца wav-ов, и их названия (типа *.wav).
Хотелось бы разрезать данный файл в автоматическом режиме, а не коцать по одному сегменту >800 раз.
Требуется ткнуть меня носом в имеющуюся инфу по поводу решения данной проблемы или подсказать на общедоступном куда идтить...
Re: Прямое копирование hex-кода на c++ builder 6.0
Здравствуйте, bedoval, Вы писали:
B>Столкнулся с dat-файлом, склеенным из полноценных wav-файлов. B>При это в его (файла) начале описаны адреса начала/конца wav-ов, и их названия (типа *.wav). B>Хотелось бы разрезать данный файл в автоматическом режиме, а не коцать по одному сегменту >800 раз. B>Требуется ткнуть меня носом в имеющуюся инфу по поводу решения данной проблемы или подсказать на общедоступном куда идтить...
Если я вас правильно понял, то вам нужно открыть файл с ключом 'b' (т.е binary) и собственно читать данные.
... << RSDN@Home 1.2.0 alpha 4 rev. 1410>>
Re[2]: Прямое копирование hex-кода на c++ builder 6.0
Здравствуйте, bedoval, Вы писали:
A>>Если я вас правильно понял, то вам нужно открыть файл с ключом 'b' (т.е binary) и собственно читать данные.
B>Спасибо, сейчас попробую.
А еще проще взять TFileStream, прочитать "оглавление" (имя файла + смещение + длина) и просто читать из файла и писать в другой поток (тоже TFileStream, но создаваемый на каждый элемент оглавления).
WBR, Dmitry Beloshistov AKA [-=BDS=-]
Re[4]: Прямое копирование hex-кода на c++ builder 6.0
Здравствуйте, DarkMaster, Вы писали:
DM>А еще проще взять TFileStream, прочитать "оглавление" (имя файла + смещение + длина) и просто читать из файла и писать в другой поток (тоже TFileStream, но создаваемый на каждый элемент оглавления).
Да, действительно — так проще, спасибо.
Re: Прямое копирование hex-кода на c++ builder 6.0
Вот первые результаты:
По средствам hex-редактора dat-файл разрезан на две части.
По следующему коду разбит на >2000 кусков индивидуального назначения:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString inFile;
AnsiString outPath;
AnsiString sk;
AnsiString outFileName1;
AnsiString outFileName2;
AnsiString outFileName3;
WideString uniCode;
TFileStream *inStream;
TFileStream *outStream;
int posStream;
int outCount;
int inSize;
int outSize;
int currentFile;
int longExt;
inFile = Form1->Edit1->Text; //get path for cutting file
inStream = new TFileStream(inFile, fmOpenRead); //make stream from cutting file
inSize = inStream->Size; //get size of cutting stream
outSize = StrToInt (Form1->Edit2->Text); //get size of result parts
posStream = 0; //set start postion for stream reading
currentFile = 1; //set start value for result file counter
outCount = inSize/outSize; //count number of result files
Form1->Edit4->Text = outCount; //show number of result files
longExt = 3; //set number of elemnt in result files extention
outPath = Form1->Edit3->Text; //get path for saving result files
outFileName1 = Form1->Edit5->Text; //get pre-name for saving result files with "start position"
outFileName2 = Form1->Edit6->Text; //get pre-name for saving result files with "final position"
outFileName3 = Form1->Edit7->Text; //get pre-name for saving result files with "sound name"
while(inSize — posStream >= outSize) //until start position of stream reading far from end of stream mor then result part continue cutting
{
sk = outFileName1 + Format(".%." + IntToStr(longExt)+ "d", OPENARRAY(TVarRec,(currentFile))); //create current name for result file of "start position"
outStream = new TFileStream(sk, fmCreate); //make stream from result file
inStream->Position = posStream; //set position for reading "start position"
outStream->CopyFrom(inStream, 4); //copy-ala-cuttig process for "start position"
delete outStream; //kill result stream
sk = outFileName2 + Format(".%." + IntToStr(longExt)+ "d", OPENARRAY(TVarRec,(currentFile))); //create current name for result file of "final position"
outStream = new TFileStream(sk, fmCreate); //make stream from result file
inStream->Position = (posStream+4); //set position for reading "final position"
outStream->CopyFrom(inStream, 4); //copy-ala-cuttig process for "final position"
delete outStream; //kill result stream
sk = outFileName3 + Format(".%." + IntToStr(longExt)+ "d", OPENARRAY(TVarRec,(currentFile))); //create current name for result file of "sound name"
outStream = new TFileStream(sk, fmCreate); //make stream from result file
inStream->Position = (posStream+16); //set position for reading "sound name"
outStream->CopyFrom(inStream, outSize-16); //copy-ala-cuttig process for "sound name"
delete outStream; //kill result stream
posStream = posStream + outSize; //correct start postion for stream reading
currentFile = currentFile + 1; // correct value for result file counter
}
delete inStream; //kill stream with cutting file
}
Re[2]: Прямое копирование hex-кода на c++ builder 6.0
Здравствуйте, bedoval, Вы писали:
B>Подскажите: B>-как вытащить адрес из файла,
Предполагаю, что так (о структуре оглавления ты ничего не говоришь):
var MyAddressValue:integer;
FileStream.Read(MyAddressValue,SizeOf(MyAddressValue));
B>-как преобразовать hex-адрес в десятичное смещение,
Зачем? У тебя адреса смещений записаны в символьном виде в виде hex значений? Или ты это в Фаре увидел?
B>-как напрямую читать поток в unicode-строку.
Unicode строка суть набор байт. Поэтому никаких отличий между чтением набора байт (буфер, строка, массив) и чтением Unicode строки нет. Или у тебя где-то еще длина хранится?
P.S. В примерах кода используй теги для форматирования исходного текста — читать невозможно.