用Perl语言实现CRC-16算法和应用

#!/usr/bin/eperl -w

#   Filename: crc-16.pl

#

#   Copyright 2012 Axxeo GmbH

#   Licensed under the Apache License, Version 2.0 (the "License");

#   you may not use this file except in compliance with the License.

#   You may obtain a copy of the License at

#

#       http://www.apache.org/licenses/LICENSE-2.0

#

#   Unless required by applicable law or agreed to in writing, software

#   distributed under the License is distributed on an "AS IS" BASIS,

#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

#   See the License for the specific language governing permissions and

#   limitations under the License.

#

my @table;

sub generateCRC16()

{

# globle @table;

# if (len(@table) == 256) & ($table[1] == 49354))

# {

#     return;

# }

my $i = 0;

my @lst;

my $data;

my $crc;

while ($i < 256) {

# body...

$data = ($i<<1);

$crc = 0;

my $j = 8;

while($j > 0)

{

$data >>=1;

if (($data ^ $crc) & 0x0001)

{

$crc = ($crc >> 1) ^ 0xA001;

}

else

{

$crc >>= 1;

}

$j -= 1;

}

$lst[$i] = $crc;

$i +=1;

}

return @lst;

}

@table = generateCRC16();

print "-----------------------------------------------\n";

print "The following is the crc-16 table:\n";

my $c = 1;

for $a (@table)

{

printf ("0x%X",$a);

print "\t";

if (($c % 8 == 0) & ($c != 0))

{

print "\n";

}

$c += 1;

}

print "-----------------------------------------------\n";

sub calculaterCRC()

{

my $string = shift(@_);

my $crc = 0xFFFF;

#foreach $chr (unpack("(a)*", $string))

foreach $chr (unpack("C*", $string))

{

$crc = ($crc >> 8) ^ $table[($crc  ^ $chr) & 0xFF ];

}

my $crcL = sprintf("\\x%X", &_Lo($crc));

my $crcH = sprintf("\\x%X", &_Hi($crc));

return $crcH.$crcL;

}

#printf ("%X\n",&calculaterCRC("Hallo World"));

sub convertchrtoacsii()

{

my $string = shift(@_);

foreach $chr (unpack("C0U4", $string))

{

print $chr." the acsii code is: ".ord($chr)."  in hex format: ";

printf "%X\n", (ord($chr));

}

return;

}

sub _Lo()

{

my $myhex = shift(@_);

return ($myhex & 0x00FF);

}

sub _Hi()

{

my $myhex = shift(@_);

return (($myhex & 0xFF00) >> 8);

}

sub checkCrc() #用于检查CRC码时候匹配

{

my ($payload, $crcsum) = @_;

print $payload."---\n";

print $crcsum."+++\n";

if ($crcsum eq &calculaterCRC($payload))

{

print "check CRC summe>>: not match!!\n";

return 1;

}

else

{

print "check CRC summe>>: match!!\n";

return 0;

}

}

sub embedPayload # 此方法主要实现将字符串中的字符转换为十六进制,并加入:作为分隔符

{

my $string = shift(@_);

my @chrs = (unpack("(a)*", $string));

my @newchrs = map { sprintf("%X", (ord($_)))} @chrs;

my $iterms =join (":", @newchrs);

return $iterms;

}

sub extraPayload # 上述方法的逆操作

{

my $iterms = shift(@_);

my @chrs = split(":",$iterms);

my @newchrs = map { chr(hex($_))} @chrs;

my $string =join ("", @newchrs);

return $string;

}

print "-----------------------------------------------\n";

print &embedPayload("ABCD")."\n";

print "---------\n";

print &extraPayload(&embedPayload("ABCD"));

#print chr("\x4F\x4B");

# usage:

# for example

# payload of message is "Hallo World"

# payload+crc(Hi)+crc(Lo)

时间: 2024-08-16 00:18:16

用Perl语言实现CRC-16算法和应用的相关文章

写给嵌入式程序员的循环冗余校验(CRC)算法入门引导

写给嵌入式程序员的循环冗余校验(CRC)算法入门引导 http://blog.csdn.net/liyuanbhu/article/details/7882789 前言 CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式.在嵌入式软件开发中,经常要用到CRC 算法对各种数据进行校验.因此,掌握基本的CRC算法应是嵌入式程序员的基本技能.可是,我认识的嵌入式程序员中能真正掌握CRC算法的人却很少,平常在项目中见到的CRC的代码多数都是那种效率非常低下的实现方式. 其实,在网上有一篇介绍CRC

【转】循环冗余校验(CRC)算法入门引导

原文地址:循环冗余校验(CRC)算法入门引导 参考地址:https://en.wikipedia.org/wiki/Computation_of_cyclic_redundancy_checks#References  给出了CRC 计算的详细信息.想要深入学习,可以从这个网址开始.尤其是最后给出的 Reference 各个是精品 http://www.zorc.breitbandkatze.de/crc.html 是个非常有用的网站,文中给出的代码都与那里的结果进行了对比 写给嵌入式程序员的循

递归学习(一)最简单的C语言递归求年龄算法

递归是我们在学习编程中,必须要去学习的,虽然递归晦涩难懂 ,但是很多时候,递归的思想会很有用,但是在实际开发中,不建议使用递归,要用循环来代替递归,不然bug无穷. ----------------------------------------------------------- 问题描述: 有5个人坐在一起, 问第5个人,他说比第4个人大2岁, 问第4个人,他说比第3个人大2岁, 问第3个人,他说比第2个人大2岁, 问第2个人,他说比第1个人大2岁, 问最后一个人,他说10岁 第5个人多大

Perl语言学习笔记 day 1

1.Perl Practical Extraction and Report Language:实用摘录与报表语言 2.多行注释 (1) =需要顶格写 = description statement; =cut (2)末尾的description需要顶格写 <<description; print "Hello,world!\n"; description 3.数字: 所有数字在Perl内都以双精度浮点数格式存储; 5**3:5*5*5: 4.字符串: 最短的字符串为空字符

C语言实现粒子群算法(PSO)二

上一回说了基本粒子群算法的实现,并且给出了C语言代码.这一篇主要讲解影响粒子群算法的一个重要参数---w.我们已经说过粒子群算法的核心的两个公式为: Vid(k+1)=w*Vid(k)+c1*r1*(Pid(k)-Xid(k))+c2*r2*(Pgd(k)-Xid(k))Xid(k+1) = Xid(k) + Vid(k+1) 标红的w即是本次我们要讨论的参数.之前w是不变的(默认取1),而现在w是变化的,w称之为惯性权重,体现的是粒子继承先前速度的能力. 经验表明:一个较大的惯性权重有利于全局

C语言实现粒子群算法(PSO)一

最近在温习C语言,看的书是<C primer Plus>,忽然想起来以前在参加数学建模的时候,用过的一些智能算法,比如遗传算法.粒子群算法.蚁群算法等等.当时是使用MATLAB来实现的,而且有些MATLAB自带了工具箱,当时有些只是利用工具箱求最优解问题,没有自己动手亲自去实现一遍,现在都忘的差不多了.我觉得那样层次实在是很浅,没有真正理解算法的核心思想.本着"纸上得来终觉浅,绝知此事要躬行"的态度,我决定现在重新复习一遍算法,然后手工用C语言重新实现一遍.说做就做,我第一

C语言100个经典算法源码片段

将写内容过程中比较常用的内容备份一次,下边内容段是关于C语言100个经典算法片段的内容. C语言的学习基础,100个经典的算法 C语言的学习要从基础开始,这里是100个经典的算法-1C语言的学习要从基础开始,这里是100个经典的算法 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔 子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数 为多少? 程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... 程序源代码: main() { long

Perl语言学习笔记 9 正则表达式处理文本

1.替换 s/PATTERN/REPLACE/; #返回是否替换成功的布尔值 可以使用捕获变量,如:s/(\w)/$1/ 匹配失败则不做任何处理 2.定界符 对于没有左右之分的定界符,重复三次即可,如:s///.s### 对于有左右之分的定界符,需使用两对,一对包含模式,一对包含替换字符串,这两对可以不一样,如:s{}{}.s[]{}.s<>[] 3.可选修饰符 /g可进行全局替换,替换所有匹配到的字符串,如:s/ / /g /s:使得 . 匹配所有字符 /i:大小写无关 4.绑定操作符 $f

Perl语言学习笔记 6 哈希

1.哈希的键是唯一的,值可以重复! 2.访问哈希元素 $hashname{"$key"};#哈希为大括号,数组为方括号,键为字符串 $family_name{"fred"} = "firstd";#给哈希元素赋值 3.哈希键支持任意表达式 $foo = "na"; $family_name{$foo."me"};#获取$family_name{"name"}对应的值 4.访问整个哈希 %

程序语言的奥妙:算法解读 &mdash;&mdash;读书笔记

算法(Algorithm) 是利用计算机解决问题的处理步骤. 算法是古老的智慧.如<孙子兵法>,是打胜仗的算法. 算法是古老智慧的结晶,是程序的范本. 学习算法才能编写出高质量的程序. 懂得了算法,游戏水平会更高. 比如下棋,如果懂得棋谱,就不需要每次考虑"寻找最好的一步棋",按照棋谱 就可以走出最好的几步棋.棋谱是先人们智慧的结果,因此掌握多种棋谱的人更 容易在对弈中获得胜利. 算法的学习类似学习游戏攻略. 算法是编写好程序的"棋谱". 算法必须满足&