Форум: "Начинающим";
Текущий архив: 2008.08.17;
Скачать: [xml.tar.bz2];
ВнизОшибка консольного приложения, при расчете CRC32 суммы? Найти похожие ветки
← →
Дима (2008-07-13 22:07) [0]Всем привет!
Заюзал сей Юнит, по расчету CRC32:unit CRCunit;
interface
function GetNewCRC(OldCRC: cardinal; StPtr: pointer; StLen: integer): cardinal;
procedure UpdateCRC(StPtr: pointer; StLen: integer; var CRC: cardinal);
function GetZipCRC(StPtr: pointer; StLen: integer): cardinal;
function GetFileCRC(const FileName: string): cardinal;
implementation
var
CRCtable: array[0..255] of cardinal;
function GetNewCRC(OldCRC: cardinal; StPtr: pointer; StLen: integer): cardinal;
asm
test edx,edx;
jz @ret;
neg ecx;
jz @ret;
sub edx,ecx; // Address after last element
push ebx;
mov ebx,0; // Set ebx=0 & align @next
@next:
mov bl,al;
xor bl,byte [edx+ecx];
shr eax,8;
xor eax,cardinal [CRCtable+ebx*4];
inc ecx;
jnz @next;
pop ebx;
@ret:
end;
procedure UpdateCRC(StPtr: pointer; StLen: integer; var CRC: cardinal);
begin
CRC := GetNewCRC(CRC, StPtr, StLen);
end;
function GetZipCRC(StPtr: pointer; StLen: integer): cardinal;
begin
Result := not GetNewCRC($FFFFFFFF, StPtr, StLen);
end;
function GetFileCRC(const FileName: string): cardinal;
const
BufSize = 64 * 1024;
var
Fi: file;
pBuf: PChar;
Count: integer;
begin
Assign(Fi, FileName);
Reset(Fi, 1);
GetMem(pBuf, BufSize);
Result := $FFFFFFFF;
repeat
BlockRead(Fi, pBuf^, BufSize, Count);
if Count = 0 then
break;
Result := GetNewCRC(Result, pBuf, Count);
until false;
Result := not Result;
FreeMem(pBuf);
CloseFile(Fi);
end;
procedure CRCInit;
var
c: cardinal;
i, j: integer;
begin
for i := 0 to 255 do
begin
c := i;
for j := 1 to 8 do
if odd(c) then
c := (c shr 1) xor $EDB88320
else
c := (c shr 1);
CRCtable[i] := c;
end;
end;
initialization
CRCinit;
end.
Использую его в консольном приложении, т. е. при запуске расчитываю конттрольную сумму самого себя (консольного приложения)
CRC32 Имени приложения расчитывается нормально а CRC32 Файла - лезет ошибка!ShowMessage("CRC32 Name" + IntToHex(GetFileCRC(sfk_n), 8)); - Ok!
ShowMessage("CRC32 File" + IntToHex(GetZipCRC(PChar(sfk_n), Length(sfk_n)), 8)); - Ошибка!
... raised exception class EInOutError with message I/O error 32.
← →
KilkennyCat © (2008-07-13 22:25) [1]может, кто-то юзает файл исчо?
← →
Правильный$Вася (2008-07-13 22:43) [2]
> CRC32 Имени приложения расчитывается нормально а CRC32 Файла
> - лезет ошибка!
что такое crc имени приложения и crc файла?
← →
Дима (2008-07-13 22:56) [3]
> Правильный$Вася (13.07.08 22:43) [2]
А что из кода юнита не ясно?
Подкорректирую:const
// Имя приложения
sfk_n = "MyApp.exe";
СRC32 Name MyApp.exe - BE885E69
> KilkennyCat © (13.07.08 22:25) [1]
;) Ёмко!
← →
Правильный$Вася (2008-07-13 23:01) [4]
> А что из кода юнита не ясно?
и сейчас тоже не ясно
приложение - это что, не файл что ли?
или ты пытаешься сам себе рассчитать crc?
тактогда открывай соответственно, а не в режиме чтение-запись
← →
Дима (2008-07-13 23:01) [5]
> CRC32 Имени приложения расчитывается нормально а CRC32 Файла
> - лезет ошибка!
>
> ShowMessage("CRC32 Name" + IntToHex(GetFileCRC(sfk_n), 8));
> - Ok!
> ShowMessage("CRC32 File" + IntToHex(GetZipCRC(PChar(sfk_n),
> Length(sfk_n)), 8)); - Ошибка!
>
> ... raised exception class EInOutError with message I/O
> error 32.
Сорри, за приведение кода, при выполнении которого лезет ошибка:ShowMessage("CRC32 Name" + IntToHex(GetFileCRC(sfk_n), 8));
- Oшибка!ShowMessage("CRC32 File" + IntToHex(GetZipCRC(PChar(sfk_n),
- Ок!
Length(sfk_n)), 8));
← →
Сергей М. © (2008-07-13 23:02) [6]Дима, дитятко, прежде чем хреначить сюда ЧУЖОЙ код, который ты "заюзал", нехило было бы разобраться в том, ЧТО в нем творится)
Ну и классический вопрос - что там тебе, Дима, говорит отладчик ?
← →
Дима (2008-07-13 23:03) [7]
> или ты пытаешься сам себе рассчитать crc?
> тактогда открывай соответственно, а не в режиме чтение-запись
Так и есть! Можно по подробнее:открывай соответственно
← →
Ляпа (2008-07-13 23:22) [8]FileMode:= fmOpenRead;
← →
Дима (2008-07-13 23:35) [9]
> Ляпа (13.07.08 23:22) [8]
Респект и Уважуха! То что надо!
Всем Огромное Спасибо за Ликбез! ;)
← →
Loginov Dmitry © (2008-07-13 23:42) [10]
> То что надо!
Имей ввиду, переменная FileMode - глобальная, и менять ее - с осторожностью, но для тестов сгодится.
Надежнее использовать WinAPI или TFileStream с открытием файла не в монопольном режиме.
← →
Тын-Дын © (2008-07-13 23:58) [11]
> Имей ввиду, переменная FileMode - глобальная, и менять ее
> - с осторожностью, но для тестов сгодится.
Никакой осторожности тут не надо. Единственное, что нужно - знать, что делаешь и зачем
> Надежнее использовать WinAPI или TFileStream с открытием
> файла не в монопольном режиме.
Всему своё время и место.
← →
Дима (2008-07-14 00:17) [12]
> Loginov Dmitry © (13.07.08 23:42) [10]
> Имей ввиду, переменная FileMode - глобальная, и менять ее
> - с осторожностью, но для тестов сгодится.
> Надежнее использовать WinAPI или TFileStream с открытием
> файла не в монопольном режиме.
К чему это может привести?
А можно краткий пример?
> Тын-Дын © (13.07.08 23:58) [11]
> Всему своё время и место.
Типо мал ешо? ;)
← →
Тын-Дын © (2008-07-14 00:33) [13]
> Дима (14.07.08 00:17) [12]
1. Паскалевские функции используют те же самы функции Win32Api, поэтому они нисколько не менее надёжны.
2. Использовать с осторожностью нужно их только в одном случае (по крайней мере так видится) - при программировании многопоточных приложений.
3. Простейшая операции восстановления переменной FileMode сразу после выполнения Reset избавит вообще от забот.
> Типо мал ешо? ;)
Ты думаешь у меня на мониторе твоя лицо видно? ;)
← →
Дима (2008-07-14 06:09) [14]
> Тын-Дын © (14.07.08 00:33) [13]
Спасибо! Теперь многое стало ясно!
> Ты думаешь у меня на мониторе твоя лицо видно? ;)
Я про опыт в Программировании! :)
← →
Loginov Dmitry © (2008-07-14 08:03) [15]> Использовать с осторожностью нужно их только в одном случае
> (по крайней мере так видится) - при программировании многопоточных
> приложений.
Именно про многопоточные приложения я и говорил. Осторожность связана с тем же. Вчера прога работала в одном потоке, завтра - в нескольких, а функция как была так и осталась. Естественно будут конфликты.
← →
Дима (2008-07-14 08:26) [16]
> Loginov Dmitry © (14.07.08 08:03) [15]
Приму на Вооружение! Спасибо!
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.08.17;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.041 c