Вверх ↑
Ответов: 273
Рейтинг: 29
#1: 2011-04-07 10:27:20 ЛС | профиль | цитата
Да, и мне подскажите, как посчитать crc32 для огромного файла?
Есть компонент в инструментах, но он вычисляет crc только для строк.
А мне нужно посчитать для огромного файла. Как правильно это оформить?

Насколько я понял нужно отмапить файл в память, а дальше... а дальше можно читать ограниченными кусками - весь файл отмапить не смогу.
У каждого куска получится своя crc. А че дальше с ними делать?


А, все, разобрался... Все оказалось проще
Только crc неправильный был - пришлось полиномы искать. Заодно и узнал подробнее про сам алгоритм

Сделал себе компонент на будущее.
Add(MultiElementEx,1265720,637,343)
{
@Hint=#50:Вычисляет CRC32 для файла по стандартному полиному|
}
BEGIN_SDK
Add(EditMultiEx,15924144,21,21)
{
WorkCount=#23:doCRC32=Вычисляет CRC32|
EventCount=#32:onCRC32=Выдает результат в поток|
VarCount=#24:CRC32=Содержит результат|
DataCount=#54:FileName=Имя файла, для которого нужно вычислить CRC32|
Width=230
Height=123
link(doCRC32,9801317:doEvent1,[(31,27)(31,55)])
link(CRC32,3622167:Value,[(27,137)(202,137)])
}
Add(CRC16_32,14272136,154,98)
{
Type=1
Metod=4
Polynom="$EDB88320"
Init="$FFFFFFFF"
link(onResult,3622167:doValue,[])
}
Add(FileStream,10662988,70,49)
{
link(onLoad,5062690:doConvert,[(107,55)(107,104)])
link(FileName,15924144:FileName,[(76,35)(27,35)])
}
Add(StreamConvertor,5062690,112,98)
{
link(onResult,14272136:doCalcCRC,[])
link(Data,10662988:Stream,[(118,90)(76,90)])
}
Add(Hub,9801317,42,49)
{
link(onEvent1,10662988:doOpen,[])
link(onEvent2,10662988:doClose,[])
}
Add(Memory,3622167,196,98)
{
link(onData,15924144:onCRC32,[(240,104)(240,27)])
}
END_SDK


code_23259.txt


Нет. Все-таки грабли еще есть. Этот алгоритм грузит в память весь файл и его обсчитывает. Нужен маппинг - памяти всегда мало.
Копаю дальше.

Добавил маппинг
Add(MultiElementEx,1265720,420,343)
{
@Hint=#50:Вычисляет CRC32 для файла по стандартному полиному|
}
BEGIN_SDK
Add(EditMultiEx,15924144,21,21)
{
WorkCount=#23:doCRC32=Вычисляет CRC32|
EventCount=#32:onCRC32=Выдает результат в поток|
VarCount=#24:CRC32=Содержит результат|
DataCount=#54:FileName=Имя файла, для которого нужно вычислить CRC32|
Width=237
Height=165
link(doCRC32,9801317:doEvent1,[(31,27)(31,55)])
link(CRC32,5481093:Var1,[(27,137)])
}
Add(CRC16_32,14272136,161,98)
{
Type=1
Metod=4
Polynom="$EDB88320"
Init="$FFFFFFFF"
link(onResult,3622167:doValue,[])
}
Add(StreamConvertor,5062690,119,98)
{
link(onResult,14272136:doCalcCRC,[])
link(Data,2681121:Stream,[(125,90)(83,90)])
}
Add(Hub,9801317,42,49)
{
OutCount=4
link(onEvent1,2681121:doOpen,[])
link(onEvent2,5062690:doConvert,[(68,62)(68,104)])
link(onEvent3,2681121:doClose,[])
link(onEvent4,4750086:doData,[(63,76)(63,153)])
}
Add(Memory,3622167,203,98)
{
}
Add(SharedStream,2681121,77,49)
{
link(FileName,15924144:FileName,[(83,35)(27,35)])
}
Add(DoData,4750086,203,147)
{
link(onEventData,15924144:onCRC32,[(244,153)(244,27)])
link(Data,5481093:Var2,[])
}
Add(GetDataEx,5481093,203,132)
{
link(Data,3622167:Value,[])
}
END_SDK


crc стали просчитываться моментально, но неправильно
Очевидно он считает crc только для спроецированного куска файла. При этом crc маленьких файлов (50кб) правильные - влазят в этот кусок.
Так не пойдет.
Надеялся, что механизм проецирования сам автоматом будет двигать зону проекции по файлу.
карма: 0

0
файлы: 1code_23259.txt [1.2KB] [133]