{*------------------------------------------------
CRC 校验
@author xszlo
@version P72
@todo 1
@History,2010-7-16,1
--------------------------------------------------*}
unit uCRC;
interface
uses
Windows, SysUtils;
type
TCRC = class(TObject)
private
Table: array[0..255] of DWORD;
procedure MakeTable();
public
procedure GetCRC32File(FileName: string; var CRC32: DWORD);
function GetCrc32Str(s: string; Seed: LongInt): string;
function GetCRC32FileHexStr(FileName: string): string;
end;
implementation
{ TCRC }
{-------------------------------------------------------------------------------
过程名: TCRC.GetCRC32File
作者: xszlo
日期: 2008.12.09
参数: FileName: string; var CRC32: DWORD
返回值: 无
作用: 生成文件的CRC32验证码
-------------------------------------------------------------------------------}
procedure TCRC.GetCRC32File(FileName: string; var CRC32: DWORD);
var
F: file;
BytesRead: DWORD;
Buffer: array[1..65521] of Byte;
i: Word;
begin
MakeTable;
FileMode := 0;
CRC32 := $FFFFFFFF;
{$I-}
AssignFile(F, FileName);
Reset(F, 1);
if IoResult = 0 then
begin
repeat
BlockRead(F, Buffer, Sizeof(Buffer), BytesRead);
for i := 1 to BytesRead do
CRC32 := (CRC32 shr 8) xor Table[Buffer[i] xor (CRC32 and $000000FF)];
until BytesRead = 0;
end;
CloseFile(F);
{$I+}
CRC32 := not CRC32;
end;
{-------------------------------------------------------------------------------
过程名: TCRC.GetCRC32FileHexStr
作者: xszlo
日期: 2008.12.09
参数: FileName: string
返回值: string
作用: 得到文件的RCR32验证码
-------------------------------------------------------------------------------}
function TCRC.GetCRC32FileHexStr(FileName: string): string;
var
dcrc32: DWORD;
begin
GetCRC32File(FileName, dcrc32);
if dcrc32 <> 0 then
result := PChar(IntToHex(dcrc32, 6));
end;
{*------------------------------------------------------------------------------
生成字符CRC验证
@param
s string
Seed Integer
@throws 无
@return string
------------------------------------------------------------------------------*}
function TCRC.GetCrc32Str(s: string; Seed: Integer): string;
var
Count: Integer;
CrcVal: LongInt;
begin
MakeTable();
CrcVal := Seed;
for Count := 1 to Length(s) do
CrcVal := Table[Byte(CrcVal xor DWORD(Ord(s[Count])))] xor ((CrcVal shr 8) and $00FFFFFF);
Result := IntToHex(not (CrcVal), 8);
end;
{-------------------------------------------------------------------------------
过程名: TCRC.MakeTable
作者: xszlo
日期: 2008.12.09
参数: 无
返回值: 无
作用: 无
-------------------------------------------------------------------------------}
procedure TCRC.MakeTable;
var
i, j, Crc: integer;
begin
for i := 0 to 255 do
begin
Crc := i;
for j := 0 to 7 do
begin
if (Crc and 1) <> 0 then
Crc := (Crc shr 1) xor $EDB88320
else
Crc := Crc shr 1;
end;
Table[i] := Crc;
end;
end;
end.
------------
使用方法:
var
CRC:TCRC;
CRC:=TCRC.Create;
showmessage(CRC.GetCRC32FileHexStr('d:\a.txt'));
FreeAndNil(CRC);
本文地址:http://www.xszlo.com/article/2012-12-13/7628.html,转发请保留这个地址,谢谢
分享到:
相关推荐
嵌入式MCGS串口通信快速入门及编程实例_第10章_Modbus通信之CRC校验_CRC计算.pdf嵌入式MCGS串口通信快速入门及编程实例_第10章_Modbus通信之CRC校验_CRC计算.pdf嵌入式MCGS串口通信快速入门及编程实例_第10章_Modbus...
在这个"文件、字符串进行CRC32校验的DLL源码"中,我们可以看到两个关键函数:GetCharCRC和GetFileCRC,分别用于处理字符串和文件的CRC32计算。 1. **CRC32原理**: - CRC32基于多项式除法的概念,通过对数据进行...
CRC16是CRC校验的一种,它通过生成一个16位的校验码与数据进行异或运算,然后通过特定的CRC多项式进行除法运算,最终得到的余数就是CRC值。这个16位的CRC值会被附加到原始数据的末尾,接收端会使用同样的算法对收到...
1. `int calculateCRC16(byte[] data)`:此方法接收一个字节数组作为输入,对这些字节进行CRC16计算,并返回16位的CRC校验和。 2. `boolean verifyCRC16(byte[] originalData, byte[] receivedData)`:此方法用于...
本文将深入探讨如何通过串口实现编码数据的收发,并结合CRC校验、求和校验和奇偶校验来确保数据的准确无误。 首先,串口(Serial Port)是一种物理接口,用于设备之间的串行通信。它允许数据逐位地发送和接收,通常...
3. **16进制转字符串**:计算出的CRC校验码也是16进制数,通常以字符串形式呈现给用户。这意味着需要将16位的二进制数转换回16进制字符串。这个过程包括将二进制数分割成4位一组,然后将每组转换为相应的16进制字符...
CRC,即循环冗余校验...用户运行这个程序,可以方便地对各种数据进行CRC校验,无论是简单的文本字符串还是大文件,都能通过这个工具快速计算出对应的8位、16位或32位CRC值,确保数据在传输和存储过程中的正确性。
例如,使用位操作代替字符串操作,或者使用缓存策略减少重复计算。 7. **单元测试**:为了确保CRC校验功能的正确性,源代码可能包含单元测试用例,用于验证不同输入数据下的校验结果是否符合预期。 通过学习和理解...
1. **QByteArray与二进制数据**:QByteArray是Qt提供的一种灵活的数据类型,可以方便地处理ASCII字符串和二进制数据。在进行CRC校验时,首先需要将原始数据转换为QByteArray。 2. **CRC算法的选择**:存在多种CRC...
通过这个LabVIEW CRC校验生成的项目,开发者能够高效地集成CRC校验功能到自己的应用中,无论数据是十进制字符还是十六进制字符串,都能轻松应对。这对于确保数据的准确性和可靠性至关重要,特别是在数据通信和存储...
校验文件和字符的MD5,CRC32码的COM组件,可以用ASP,PHP等调用。 网上找了很久都没有完整的,自己动手将收集的资料编译了一个DLL。... Response.Write (ASPObj.CStrToCRC32("字符串", 0)) '校验字符串的CRC32 %>
生成多项式的选取对CRC校验的有效性至关重要,通常选择的是具有较好错误检测能力的多项式。 #### 三、Java中的CRC校验实现 在Java中实现CRC校验,可以采用自定义算法的方式,如上文给出的`CRC16Checker`类所示。...
在这些文件中,可能包含了处理Hex文件和进行校验码校验的函数或类定义。 在实际应用中,解析Hex文件并进行校验码校验可能涉及到以下步骤: 1. **创建解析器类**:定义一个类来处理Hex文件的读取和转换。 2. **实现...
在CRCStrTest.java文件中,可能包含了一个实现,将字符串转换成字节数组,然后进行CRC16计算。首先,字符串被编码为字节序列(通常使用ASCII或UTF-8),然后对每个字节执行CRC16算法。每个字节都会与当前CRC值异或,...
下面将详细介绍CRC校验的基本原理、C#实现CRC校验的方法以及如何利用提供的文件进行CRC校验。 CRC校验是通过一种特定的数学算法来生成一个固定长度的校验码,这个校验码与原始数据关联,并用于检测数据在传输或存储...
CRC(Cyclic Redundancy Check,循环冗余校验)...通过上述的C语言代码,我们可以给任意长度的字符串添加CRC校验码,以提高数据传输的可靠性。在实际项目中,CRC校验码通常会附加到数据的末尾,以便在接收端进行验证。
例如,你可以使用字符串函数将接收到的二进制数据转换成可读的ASCII字符串,或者使用结构化数据解析工具处理Modbus协议中的寄存器和线圈值。对于Modbus 485协议,解析缓冲区数据意味着解码功能码、提取寄存器值并...
在CRC实现中,我们可能需要用到QByteArray的fromHex()和toHex()方法来处理十六进制字符串和二进制数据之间的转换。 在程序中,我们可以创建一个CRC类,包含计算CRC的方法。这个方法可能接受一个QByteArray作为输入...
1. **CRC16原理**:CRC16的基本工作原理是将数据看作二进制串,然后除以一个预定义的CRC16多项式,得到的余数就是CRC校验码。这个多项式通常是一个16位的二进制数,例如X^16 + X^15 + X^2 + 1,对应的十进制表示为...
此CRC校验工具支持:CRC3、CRC4、CRC5、CRC6、CRC7、CRC8、CRC11、CRC12、CRC13、CRC14、CRC15、CRC16、CRC...支持计算的数据:16进制HEX、字符串、文件,字符串支持ANSI、UTF8、Unicode、Unicode BigEndian编码方式。