Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.046 c
2-1215771573
Fobiya
2008-07-11 14:19
2008.08.17
Как можно обойти нажатие NumLock


15-1214991525
Дебил какой-то
2008-07-02 13:38
2008.08.17
Где же винда хранит пароли от интернета ?


2-1216027505
elserpiente
2008-07-14 13:25
2008.08.17
TTreeView изменение стиля текста элемента


2-1215590113
Tested2
2008-07-09 11:55
2008.08.17
Получить jpg из mov


2-1215647770
Gringoire
2008-07-10 03:56
2008.08.17
Простейший вопрос по текстовым файлам





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский