运行结果一样阿
你是输入的数是什么,让我试一下的看是不一样
不过我觉得这不像是奇偶校验
你这里是输入的都是0,1是吧
之后再分别算行中有奇数个1的行数e
有奇数个1的列的总数f
再输出两个数中较大的一个数作为结果
这叫奇偶校验吗
程序好像没有问题,我想问一下VC是怎么过不了
我没VC,解决不了
直接17位算第18位:
=MID("10X98765432",MOD(SUM(MID(A1,ROW($1:$17),1)2^(18-ROW($1:$17))),11)+1,1)
15位变为18位:
=REPLACE(A1,7,,19)&MID("10X98765432",MOD(SUM(MID(REPLACE(A1,7,,19),ROW($1:$17),1)2^(18-ROW($1:$17))),11)+1,1)
这里的ROW($1:$17) 最好用 ROW(INDIRECT("1:17")) 这样不会因为删除行影响公式。
在工业控制中,Modbus RTU CRC16的校验码用的比较广泛,包括本人富士产品中,PC与伺服电机以及PC与VP系列的变频器的Modbus RTU通讯中都使用到了CRC16
而对CRC16的计算的方式基本上有2种:第一种,使用双循环依照CRC的计算方法进行计算,第二种,采用查表的方式。本人愚钝无比,从网络上搜来的查表法都与实际的正确CRC16的结果有所差异,因此编写了一个小程序供自己使用。
软件的界面很简单,输入诸如“010303020014”的值,然后每2个字符作为一个字节,填入字节数,然后就可以计算出校验码,校验码的多项式为:X16+X15+X2+1
程序界面如下:
实现的源代码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Edit2: TEdit;
Edit3: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Memo1: TMemo;
Label4: TLabel;
function CalCRC16(AData:array of Byte;AStart,AEnd:Integer):Word;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R dfm}
//××××××××××××××××××××××××××
// CalCRC16用于计算Modbus RTU的CRC16
// 多项式公式为X16+X15+X2+1
//××××××××××××××××××××××××××
function TForm1CalCRC16(AData:array of Byte;AStart,AEnd:Integer):Word;
const
GENP=$A001; //多项式公式X16+X15+X2+1(1100 0000 0000 0101)
var
crc:Word;
i:Integer;
tmp:Byte;
procedure CalOneByte(AByte:Byte); //计算1个字节的校验码
var
j:Integer;
begin
crc:=crc xor AByte; //将数据与CRC寄存器的低8位进行异或
for j:=0 to 7 do //对每一位进行校验
begin
tmp:=crc and 1; //取出最低位
crc:=crc shr 1; //寄存器向右移一位
crc:=crc and $7FFF; //将最高位置0
if tmp=1 then //检测移出的位,如果为1,那么与多项式异或
crc:=crc xor GENP;
crc:=crc and $FFFF;
end;
end;
begin
crc:=$FFFF; //将余数设定为FFFF
for i:=AStart to AEnd do //对每一个字节进行校验
CalOneByte(AData[i]);
Result:=crc;
end;
procedure TForm1Button1Click(Sender: TObject);
var
Data:array[0255] of Byte;
i,j,Count:Integer;
Res:Word;
szData:string;
begin
szData:=Form1Edit2Text; //读入欲校验的字符串
Count:=StrToInt(form1Edit3Text); //读入需要计算的字符串长度
i:=1;
j:=0;
for j:=0 to Count-1 do
begin
if (i mod 2)=0 then //每2个字符放入一个字节中
i:=i+1;
if i>=Length(szData) then
exit;
Data[j]:=StrToInt('$'+copy(szData,i,2)); //取出字符并转换为16进制数
i:=i+1;
end;
Res:=CalCRC16(Data,Low(Data),Count-1);
form1Edit1Text:=IntToHex(Res,4);
end;
end
发票校验码在发票上的备注栏查看,增值税普通发票可以用校验码查询发票的真伪,如下图所示:
相关规定
一、增值税普通发票的格式、字体、栏次、内容与增值税专用发票完全一致,按发票联次分为两联票和五联票两种,基本联次为两联,第一联为记账联,销货方用作记账凭证;
第二联为发票联,购货方用作记账凭证。此外为满足部分纳税人的需要,在基本联次后添加了三联的附加联次,即五联票,供企业选择使用。
二、增值税普通发票第二联(发票联)采用防伪纸张印制。代码采用专用防伪油墨印刷,号码的字型为专用异型体。各联次的颜色依次为蓝、橙、绿蓝、黄绿和紫红色。
三、凡纳入“一机多票”系统(包括试运行)的一般纳税人,自纳入之日起,一律使用全国统一的增值税普通发票,并通过防伪税控系统开具。
对于一般纳税人已领购但尚未使用的旧版普通发票,由主管税务机关限期缴销或退回税务机关;经税务机关批准使用印有本单位名称发票的一般纳税人,允许其暂缓纳入“一机多票”系统,以避免库存发票的浪费,
四、增值税普通发票的价格由国家发改委统一制定。
五、各级税务机关要高度重视“一机多票”系统的试运行工作,切实做好新旧普通发票的衔接工作。要掌握情况,统筹布置,合理安排.确保“一机多票”系统顺利推行。
扩展资料:
发票的种类:
普通发票和增值税专用发票。
1、普通发票:主要由营业税纳税人和增值税小规模纳税人使用,增值税一般纳税人在不能开具专用发票的情况下也可使用普通发票。
普通发票由行业发票和专用发票组成。前者适用于某个行业和经营业务,如商业零售统一发票、商业批发统一发票、工业企业产品销售统一发票等;后者仅适用于某一经营项目,如广告费用结算发票,商品房销售发票等。
2、增值税专用发票是我国实施新税制的产物,是国家税务部门根据增值税征收管理需要而设定的,专用于纳税人销售或者提供增值税应税项目的一种发票。
3、专用发票既具有普通发票所具有的内涵。同时还具有比普通发票更特殊的作用。它不仅是记载商品销售额和增值税税额的财务收支凭证。而且是兼记销货方纳税义务和购货方进项税额的合法证明,是购货方据以抵扣税款的法定凭证,对增值税的计算起着关键性作用。
参考资料来源:
百度百科-发票
百度百科——增值税普通发票
以上就是关于奇偶校验码程序代码全部的内容,包括:奇偶校验码程序代码、程序流程图:身份z号码的校验码计算如下、php 实现crc16验证 modbus该如何实现等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)