Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.17;
Скачать: CL | DM;

Вниз

Ошибка консольного приложения, при расчете 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.019 c
15-1214594861
stas
2008-06-27 23:27
2008.08.17
Посоветуйте фотоаппарат


2-1216031084
small
2008-07-14 14:24
2008.08.17
TXPMAnifest


15-1214545283
Регвин
2008-06-27 09:41
2008.08.17
посоветуйте хороший учебник по DELPHI


4-1194334678
Mamed
2007-11-06 10:37
2008.08.17
Lan Card Disable


2-1216011985
dreamse
2008-07-14 09:06
2008.08.17
Подскажите какое свой ство в компоненте TTable или TQuery