①..设置CRC寄存器,并给其赋值FFFF(hex).
理论上这样就完成了.
修改以后的代码为:
for ( $x=0; $xstrlen( $string ); $x◆◆ )
{
$crc = $crc ^ ord( $string[$x] );
if ( ($crc 0x0001) == 0x0001 )
$crc = ( ($crc 1 ) ^ 0xA001 );
else
$crc = $crc 1;
}
return $crc;
如果你位运算的基础不好的话,建议先理解位运算.
参考资料:
crc:
位运算:
希望有帮助到你.
首先,要纠正一个概念上的错误,CRC算法是用来验证完整性的算法,它并不能提供错误修复的能力.
如果需要在接收端进行错误的修复,则需要使用某种前向错误修正算法,比如里德-索罗门算法等,这些算法在PHP库中好像没有实现.相关的资料可以查看:
程序界面如下:
实现的源代码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Label1: TLabel;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//XXXXXXXXXXXXXXXXXXXXXXXXXX
const
crc:Word;
i:Integer;
tmp:Byte;
procedure CalOneByte(AByte:Byte); //计算1个字节的校验码
j:Integer;
begin
tmp:=crc and 1; //取出最低位
crc:=crc shr 1; //寄存器向右移一位
if tmp=1 then //检测移出的位,如果为1,那么与多项式异或
crc:=crc xor GENP;
crc:=crc and $FFFF;
crc:=$FFFF; //将余数设定为FFFF
for i:=AStart to AEnd do //对每一个字节进行校验
CalOneByte(AData[i]);
Result:=crc;
procedure TForm1.Button1Click(Sender: TObject);
i,j,Count:Integer;
Res:Word;
szData:string;
i:=1;
j:=0;
for j:=0 to Count-1 do
i:=i◆1;
if i=Length(szData) then
exit;
end.
php
$crc_table?=?array(
genCRC?($test);
function?genCRC?($ptr)
$crc?=?0x0000;
$crc_table?=?$GLOBALS['crc_table'];
for?($i?=?0;?$i?strlen($ptr);?$i◆◆)
return?$crc;
,需要的朋友可以参考下
复制代码
代码如下:
function
_getHash($username)
$hash
=
%
return
$hash;
_getTable($username)
self::_getHash($username);
'user_'
.
php手册的描述:
Because
PHP's
integer
is
signed
many
checksums
will
result
in
negative
integers
on
platforms.
On
installations
all
results
be
positive
though.
CRC算法是按字长位数bit进行计算的.
PHP_INT_SIZE,PHP_INT_MAX
这两个常量的定义:
位有符号).PHP
不支持无符号整数.Integer值的字长可以用常量PHP_INT_SIZE来表示,自
PHP
和
以上就是土嘎嘎小编为大家整理的求php下crc相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!