![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка консольного приложения, при расчете CRC32 суммы? [D7, XP]
Дима © (2008-07-13 22:07:00)Всем привет!
Заюзал сей Юнит, по расчету 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.
Дима (2008-07-14 08:26:00) [1]
> Loginov Dmitry © (14.07.08 08:03) [15]
Приму на Вооружение! Спасибо!
Loginov Dmitry (2008-07-14 08:03:00) [2]> Использовать с осторожностью нужно их только в одном случае
> (по крайней мере так видится) - при программировании многопоточных
> приложений.
Именно про многопоточные приложения я и говорил. Осторожность связана с тем же. Вчера прога работала в одном потоке, завтра - в нескольких, а функция как была так и осталась. Естественно будут конфликты.
Дима (2008-07-14 06:09:00) [3]
> Тын-Дын © (14.07.08 00:33) [13]
Спасибо! Теперь многое стало ясно!
> Ты думаешь у меня на мониторе твоя лицо видно? ;)
Я про опыт в Программировании! :)
Тын-Дын (2008-07-14 00:33:00) [4]
> Дима (14.07.08 00:17) [12]
1. Паскалевские функции используют те же самы функции Win32Api, поэтому они нисколько не менее надёжны.
2. Использовать с осторожностью нужно их только в одном случае (по крайней мере так видится) - при программировании многопоточных приложений.
3. Простейшая операции восстановления переменной FileMode сразу после выполнения Reset избавит вообще от забот.
> Типо мал ешо? ;)
Ты думаешь у меня на мониторе твоя лицо видно? ;)
Дима (2008-07-14 00:17:00) [5]
> Loginov Dmitry © (13.07.08 23:42) [10]
> Имей ввиду, переменная FileMode - глобальная, и менять ее
> - с осторожностью, но для тестов сгодится.
> Надежнее использовать WinAPI или TFileStream с открытием
> файла не в монопольном режиме.
К чему это может привести?
А можно краткий пример?
> Тын-Дын © (13.07.08 23:58) [11]
> Всему своё время и место.
Типо мал ешо? ;)
Тын-Дын (2008-07-13 23:58:00) [6]
> Имей ввиду, переменная FileMode - глобальная, и менять ее
> - с осторожностью, но для тестов сгодится.
Никакой осторожности тут не надо. Единственное, что нужно - знать, что делаешь и зачем
> Надежнее использовать WinAPI или TFileStream с открытием
> файла не в монопольном режиме.
Всему своё время и место.
Loginov Dmitry (2008-07-13 23:42:00) [7]
> То что надо!
Имей ввиду, переменная FileMode - глобальная, и менять ее - с осторожностью, но для тестов сгодится.
Надежнее использовать WinAPI или TFileStream с открытием файла не в монопольном режиме.
Дима (2008-07-13 23:35:00) [8]
> Ляпа (13.07.08 23:22) [8]
Респект и Уважуха!То что надо!
Всем Огромное Спасибо за Ликбез! ;)
Ляпа (2008-07-13 23:22:00) [9]FileMode:= fmOpenRead;
Дима (2008-07-13 23:03:00) [10]
> или ты пытаешься сам себе рассчитать crc?
> тактогда открывай соответственно, а не в режиме чтение-запись
Так и есть! Можно по подробнее:
открывай соответственно
Сергей М. (2008-07-13 23:02:00) [11]Дима, дитятко, прежде чем хреначить сюда ЧУЖОЙ код, который ты "заюзал", нехило было бы разобраться в том, ЧТО в нем творится)
Ну и классический вопрос - что там тебе, Дима, говорит отладчик ?
Правильный$Вася (2008-07-13 23:01:00) [12]
> А что из кода юнита не ясно?
и сейчас тоже не ясно
приложение - это что, не файл что ли?
или ты пытаешься сам себе рассчитать crc?
тактогда открывай соответственно, а не в режиме чтение-запись
Дима (2008-07-13 23:01:00) [13]
> 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 22:56:00) [14]
> Правильный$Вася (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 22:43:00) [15]
> CRC32 Имени приложения расчитывается нормально а CRC32 Файла
> - лезет ошибка!
что такое crc имени приложения и crc файла?
KilkennyCat (2008-07-13 22:25:00) [16]может, кто-то юзает файл исчо?