C#實現(xiàn)的4種常用數(shù)據(jù)校驗方法小結(CRC校驗,LRC校驗,BCC校驗,累加和校驗)_第1頁
C#實現(xiàn)的4種常用數(shù)據(jù)校驗方法小結(CRC校驗,LRC校驗,BCC校驗,累加和校驗)_第2頁
C#實現(xiàn)的4種常用數(shù)據(jù)校驗方法小結(CRC校驗,LRC校驗,BCC校驗,累加和校驗)_第3頁
C#實現(xiàn)的4種常用數(shù)據(jù)校驗方法小結(CRC校驗,LRC校驗,BCC校驗,累加和校驗)_第4頁
C#實現(xiàn)的4種常用數(shù)據(jù)校驗方法小結(CRC校驗,LRC校驗,BCC校驗,累加和校驗)_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第C#實現(xiàn)的4種常用數(shù)據(jù)校驗方法小結(CRC校驗,LRC校驗,BCC校驗,累加和校驗)CRC即循環(huán)冗余校驗碼(CyclicRedundancyCheck):是數(shù)據(jù)通信領域中最常用的一種查錯校驗碼,其特征是信息字段和校驗字段的長度可以任意選定。循環(huán)冗余檢查(CRC)是一種數(shù)據(jù)傳輸檢錯功能,對數(shù)據(jù)進行多項式計算,并將得到的結果附在幀的后面,接收設備也執(zhí)行類似的算法,以保證數(shù)據(jù)傳輸?shù)恼_性和完整性。

CRC算法參數(shù)模型解釋:

NAME:參數(shù)模型名稱。WIDTH:寬度,即CRC比特數(shù)。POLY:生成項的簡寫,以16進制表示。例如:CRC-32即是0x04C11DB7,忽略了最高位的1,即完整的生成項是0x104C11DB7。INIT:這是算法開始時寄存器(crc)的初始化預置值,十六進制表示。REFIN:待測數(shù)據(jù)的每個字節(jié)是否按位反轉,True或False。REFOUT:在計算后之后,異或輸出之前,整個數(shù)據(jù)是否按位反轉,True或False。XOROUT:計算結果與此參數(shù)異或后得到最終的CRC值。

///**********************************************************************

///Name:CRC-4/ITU

x4+x+1

///Poly:0x03

///Init:0x00

///Refin:true

///Refout:true

///Xorout:0x00

///*************************************************************************

publicstaticbyte[]Crc1(byte[]buffer,intstart=0,intlen=0)

{

if(buffer==null||buffer.Length==0)returnnull;

if(start0)returnnull;

if(len==0)len=buffer.Length-start;

intlength=start+len;

if(lengthbuffer.Length)returnnull;

bytecrc=0;//Initialvalue

for(inti=start;ilength;i++)

{

crc^=buffer[i];

for(intj=0;jj++)

{

if((crc1)0)

crc=(byte)((crc1)^0x0C);//0x0C=(reverse0x03)(8-4)

else

crc=(byte)(crc1);

}

}

returnnewbyte[]{crc};

}

///**********************************************************************

///Name:CRC-5/EPC

x5+x3+1

///Poly:0x09

///Init:0x09

///Refin:false

///Refout:false

///Xorout:0x00

///*************************************************************************

publicstaticbyte[]Crc2(byte[]buffer,intstart=0,intlen=0)

{

if(buffer==null||buffer.Length==0)returnnull;

if(start0)returnnull;

if(len==0)len=buffer.Length-start;

intlength=start+len;

if(lengthbuffer.Length)returnnull;

bytecrc=0x48;//Initialvalue:0x48=0x09(8-5)

for(inti=start;ilength;i++)

{

crc^=buffer[i];

for(intj=0;jj++)

{

if((crc0x80)0)

crc=(byte)((crc1)^0x48);//0x48=0x09(8-5)

else

crc=(byte)(crc1);

}

}

returnnewbyte[]{(byte)(crc3)};

}

///**********************************************************************

///Name:CRC-5/ITU

x5+x4+x2+1

///Poly:0x15

///Init:0x00

///Refin:true

///Refout:true

///Xorout:0x00

///*************************************************************************

publicstaticbyte[]Crc3(byte[]buffer,intstart=0,intlen=0)

{

if(buffer==null||buffer.Length==0)returnnull;

if(start0)returnnull;

if(len==0)len=buffer.Length-start;

intlength=start+len;

if(lengthbuffer.Length)returnnull;

bytecrc=0;//Initialvalue

for(inti=start;ilength;i++)

{

crc^=buffer[i];

for(intj=0;jj++)

{

if((crc1)0)

crc=(byte)((crc1)^0x15);//0x15=(reverse0x15)(8-5)

else

crc=(byte)(crc1);

}

}

returnnewbyte[]{crc

};

}

///**********************************************************************

///Name:CRC-5/USB

x5+x2+1

///Poly:0x05

///Init:0x1F

///Refin:true

///Refout:true

///Xorout:0x1F

///*************************************************************************

publicstaticbyte[]Crc4(byte[]buffer,intstart=0,intlen=0)

{

if(buffer==null||buffer.Length==0)returnnull;

if(start0)returnnull;

if(len==0)len=buffer.Length-start;

intlength=start+len;

if(lengthbuffer.Length)returnnull;

bytecrc=0x1F;//Initialvalue

for(inti=start;ilength;i++)

{

crc^=buffer[i];

for(intj=0;jj++)

{

if((crc1)0)

crc=(byte)((crc1)^0x14);//0x14=(reverse0x05)(8-5)

else

crc=(byte)(crc1);

}

}

returnnewbyte[]{(byte)(crc^0x1F)

};

}

///**********************************************************************

///Name:CRC-6/ITU

x6+x+1

///Poly:0x03

///Init:0x00

///Refin:true

///Refout:true

///Xorout:0x00

///*************************************************************************

publicstaticbyte[]Crc5(byte[]buffer,intstart=0,intlen=0)

{

if(buffer==null||buffer.Length==0)returnnull;

if(start0)returnnull;

if(len==0)len=buffer.Length-start;

intlength=start+len;

if(lengthbuffer.Length)returnnull;

bytecrc=0;//Initialvalue

for(inti=start;ilength;i++)

{

crc^=buffer[i];

for(intj=0;jj++)

{

if((crc1)0)

crc=(byte)((crc1)^0x30);//0x30=(reverse0x03)(8-6)

else

crc=(byte)(crc1);

}

}

returnnewbyte[]{crc

};

}

///**********************************************************************

///Name:CRC-7/MMC

x7+x3+1

///Poly:0x09

///Init:0x00

///Refin:false

///Refout:false

///Xorout:0x00

///*************************************************************************

publicstaticbyte[]Crc6(byte[]buffer,intstart=0,intlen=0)

{

if(buffer==null||buffer.Length==0)returnnull;

if(start0)returnnull;

if(len==0)len=buffer.Length-start;

intlength=start+len;

if(lengthbuffer.Length)returnnull;

bytecrc=0;//Initialvalue

for(inti=start;ilength;i++)

{

crc^=buffer[i];

for(intj=0;jj++)

{

if((crc0x80)0)

crc=(byte)((crc1)^0x12);//0x12=0x09(8-7)

else

crc=(byte)(crc1);

}

}

returnnewbyte[]{(byte)(crc1)

};

}

///**********************************************************************

///Name:CRC8

x8+x2+x+1

///Poly:0x07

///Init:0x00

///Refin:false

///Refout:false

///Xorout:0x00

///*************************************************************************

publicstaticbyte[]Crc7(byte[]buffer,intstart=0,intlen=0)

{

if(buffer==null||buffer.Length==0)returnnull;

if(start0)returnnull;

if(len==0)len=buffer.Length-start;

intlength=start+len;

if(lengthbuffer.Length)returnnull;

bytecrc=0;//Initialvalue

for(inti=start;ilength;i++)

{

crc^=buffer[i];

for(intj=0;jj++)

{

if((crc0x80)0)

crc=(byte)((crc1)^0x07);

else

crc=(byte)(crc1);

}

}

returnnewbyte[]{crc

};

}

///**********************************************************************

///Name:CRC-8/ITU

x8+x2+x+1

///Poly:0x07

///Init:0x00

///Refin:false

///Refout:false

///Xorout:0x55

///*************************************************************************

publicstaticbyte[]Crc8(byte[]buffer,intstart=0,intlen=0)

{

if(buffer==null||buffer.Length==0)returnnull;

if(start0)returnnull;

if(len==0)len=buffer.Length-start;

intlength=start+len;

if(lengthbuffer.Length)returnnull;

bytecrc=0;//Initialvalue

for(inti=start;ilength;i++)

{

crc^=buffer[i];

for(intj=0;jj++)

{

if((crc0x80)0)

crc=(byte)((crc1)^0x07);

else

crc=(byte)(crc1);

}

}

returnnewbyte[]{(byte)(crc^0x55)

};

}

///**********************************************************************

///Name:CRC-8/MAXIM

x8+x5+x4+1

///Poly:0x31

///Init:0x00

///Refin:true

///Refout:true

///Xorout:0x00

///*************************************************************************

publicstaticbyte[]Crc9(byte[]buffer,intstart=0,intlen=0)

{

if(buffer==null||buffer.Length==0)returnnull;

if(start0)returnnull;

if(len==0)len=buffer.Length-start;

intlength=start+len;

if(lengthbuffer.Length)returnnull;

bytecrc=0;//Initialvalue

for(inti=start;ilength;i++)

{

crc^=buffer[i];

for(intj=0;jj++)

{

if((crc1)0)

crc=(byte)((crc1)^0x8C);//0x8C=reverse0x31

else

crc=(byte)(crc1);

}

}

returnnewbyte[]{crc

};

}

///**********************************************************************

///Name:CRC-8/ROHC

x8+x2+x+1

///Poly:0x07

///Init:0xFF

///Refin:true

///Refout:true

///Xorout:0x00

///*************************************************************************

publicstaticbyte[]Crc10(byte[]buffer,intstart=0,intlen=0)

{

if(buffer==null||buffer.Length==0)returnnull;

if(start0)returnnull;

if(len==0)len=buffer.Length-start;

intlength=start+len;

if(lengthbuffer.Length)returnnull;

bytecrc=0xFF;//Initialvalue

for(inti=start;ilength;i++)

{

crc^=buffer[i];

for(intj=0;jj++)

{

if((crc1)0)

crc=(byte)((crc1)^0xE0);//0xE0=reverse0x07

else

crc=(byte)(crc1);

}

}

returnnewbyte[]{crc

};

}

///Z1協(xié)議校驗碼計算

staticbyte[]table={0x00,0x1C,0x38,0x24,0x70,0x6C,0x48,0x54,0xE0,0xFC,

0xD8,0xC4,0x90,0x8C,0xA8,0xB4,0xDC,0xC0,0xE4,0xF8,

0xAC,0xB0,0x94,0x88,0x3C,0x20,0x04,0x18,0x4C,0x50,

0x74,0x68,0xA4,0xB8,0x9C,0x80,0xD4,0xC8,0xEC,0xF0,

0x44,0x58,0x7C,0x60,0x34,0x28,0x0C,0x10,0x78,0x64,

0x40,0x5C,0x08,0x14,0x30,0x2C,0x98,0x84,0xA0,0xBC,

0xE8,0xF4,0xD0,0xCC,0x54,0x48,0x6C,0x70,0x24,0x38,

0x1C,0x00,0xB4,0xA8,0x8C,0x90,0xC4,0xD8,0xFC,0xE0,

0x88,0x94,0xB0,0xAC,0xF8,0xE4,0xC0,0xDC,0x68,0x74,

0x50,0x4C,0x18,0x04,0x20,0x3C,0xF0,0xEC,0xC8,0xD4,

0x80,0x9C,0xB8,0xA4,0x10,0x0C,0x28,0x34,0x60,0x7C,

0x58,0x44,0x2C,0x30,0x14,0x08,0x5C,0x40,0x64,0x78,

0xCC,0xD0,0xF4,0xE8,0xBC,0xA0,0x84,0x98,0xA8,0xB4,

0x90,0x8C,0xD8,0xC4,0xE0,0xFC,0x48,0x54,0x70,0x6C,

0x38,0x24,0x00,0x1C,0x74,0x68,0x4C,0x50,0x04,0x18,

0x3C,0x20,0x94,0x88,0xAC,0xB0,0xE4,0xF8,0xDC,0xC0,

0x0C,0x10,0x34,0x28,0x7C,0x60,0x44,0x58,0xEC,0xF0,

0xD4,0xC8,0x9C,0x80,0xA4,0xB8,0xD0,0xCC,0xE8,0xF4,

0xA0,0xBC,0x98,0x84,0x30,0x2C,0x08,0x14,0x40,0x5C,

0x78,0x64,0xFC,0xE0,0xC4,0xD8,0x8C,0x90,0xB4,0xA8,

0x1C,0x00,0x24,0x38,0x6C,0x70,0x54,0x48,0x20,0x3C,

0x18,0x04,0x50,0x4C,0x68,0x74,0xC0,0xDC,0xF8,0xE4,

0xB0,0xAC,0x88,0x94,0x58,0x44,0x60,0x7C,0x28,0x34,

0x10,0x0C,0xB8,0xA4,0x80,0x9C,0xC8,0xD4,0xF0,0xEC,

0x84,0x98,0xBC,0xA0,0xF4,0xE8,0xCC,0xD0,0x64,0x78,

0x5C,0x40,0x14,0x08,0x2C,0x30

};

publicstaticbyte[]Crc11(byte[]buffer,intstart=0,intlen=0)

{

if(buffer==null||buffer.Length==0)returnnull;

if(start0)returnnull;

if(len==0)len=buffer.Length-start;

intlength=start+len;

if(lengthbuffer.Length)returnnull;

inti;

bytecrc=0x00;

inttableIndex;

for(i=start;ilength;i++)

{

tableIndex=crc^(buffer[i]0xFF);

crc=table[tableIndex];

}

returnnewbyte[]{crc};

}

///**********************************************************************

///Name:CRC-12

x16+x12+x5+1

///Poly:0x80

///Init:0x0000

///Refin:true

///Refout:true

///Xorout:0x0000

///*************************************************************************

publicstaticbyte[]Crc12(byte[]buffer,intstart=0,intlen=0)

{

if(buffer==null||buffer.Length==0)returnnull;

if(start0)returnnull;

if(len==0)len=buffer.Length-start;

intlength=start+len;

if(lengthbuffer.Length)returnnull;

ushortcrc=0;//Initialvalue

shortiQ=0,iR=0;

for(inti=start;ilength;i++)

{

//多項式除法

//如果該位為1

if((buffer[i](0x80iR))0)

{

//則在余數(shù)尾部添1否則添0

crc|=0x01;

}

//如果12位除數(shù)中的最高位為1,則夠除

if(crc=0x1000)

{

crc^=0x180D;

}

crc=1;

iR++;

if(8==iR)

{

iR=0;

iQ++;

}

}

//對后面添加的12個0做處理

for(inti=0;ii++)

{

if(crc=0x1000)

{

crc^=0x180D;

}

crc=1;

}

crc=1;

byte[]ret=BitConverter.GetBytes(crc);

Array.Reverse(ret);

returnret;

}

///**********************************************************************

///Name:CRC-16/CCITT

x16+x12+x5+1

///Poly:0x1021

///Init:0x0000

///Refin:true

///Refout:true

///Xorout:0x0000

///*************************************************************************

publicstaticbyte[]Crc13(byte[]buffer,intstart=0,intlen=0)

{

if(buffer==null||buffer.Length==0)returnnull;

if(start0)returnnull;

if(len==0)len=buffer.Length-start;

intlength=start+len;

if(lengthbuffer.Length)returnnull;

ushortcrc=0;//Initialvalue

for(inti=start;ilength;i++)

{

crc^=buffer[i];

for(intj=0;jj++)

{

if((crc1)0)

crc=(ushort)((crc1)^0x8408);//0x8408=reverse0x1021

else

crc=(ushort)(crc1);

}

}

byte[]ret=BitConverter.GetBytes(crc);

Array.Reverse(ret);

returnret;

}

///**********************************************************************

///Name:CRC-16/CCITTFALSE

x16+x12+x5+1

///Poly:0x1021

///Init:0xFFFF

///Refin:false

///Refout:false

///Xorout:0x0000

///*************************************************************************

publicstaticbyte[]Crc14(byte[]buffer,intstart=0,intlen=0)

{

if(buffer==null||buffer.Length==0)returnnull;

if(start0)returnnull;

if(len==0)len=buffer.Length-start;

intlength=start+len;

if(lengthbuffer.Length)returnnull;

ushortcrc=0xFFFF;//Initialvalue

for(inti=start;ilength;i++)

{

crc^=(ushort)(buffer[i]8);

for(intj=0;jj++)

{

if((crc0x8000)0)

crc=(ushort)((crc1)^0x1021);

else

crc=(ushort)(crc1);

}

}

byte[]ret=BitConverter.GetBytes(crc);

Array.Reverse(ret);

returnret;

}

///**********************************************************************

///Name:CRC-16/DNP

x16+x13+x12+x11+x10+x8+x6+x5+x2+1

///Poly:0x3D65

///Init:0x0000

///Refin:true

///Refout:true

///Xorout:0xFFFF

///*************************************************************************

publicstaticbyte[]Crc15(byte[]buffer,intstart=0,intlen=0)

{

if(buffer==null||buffer.Length==0)returnnull;

if(start0)returnnull;

if(len==0)len=buffer.Length-start;

intlength=start+len;

if(lengthbuffer.Length)returnnull;

ushortcrc=0;//Initialvalue

for(inti=start;ilength;i++)

{

crc^=buffer[i];

for(intj=0;jj++)

{

if((crc1)0)

crc=(ushort)((crc1)^0xA6BC);//0xA6BC=reverse0x3D65

else

crc=(ushort)(crc1);

}

}

byte[]ret=BitConverter.GetBytes((ushort)~crc);

Array.Reverse(ret);

returnret;

}

///**********************************************************************

///Name:CRC-16/IBM

x16+x15+x2+1

///Poly:0x8005

///Init:0x0000

///Refin:true

///Refout:true

///Xorout:0x0000

///*************************************************************************

publicstaticbyte[]Crc16(byte[]buffer,intstart=0,intlen=0)

{

if(buffer==null||buffer.Length==0)returnnull;

if(start0)returnnull;

if(len==0)len=buffer.Length-start;

intlength=start+len;

if(lengthbuffer.Length)returnnull;

ushortcrc=0;//Initialvalue

for(inti=start;ilength;i++)

{

crc^=buffer[i];

for(intj=0;jj++)

{

if((crc1)0)

crc=(ushort)((crc1)^0xA001);//0xA001=reverse0x8005

else

crc=(ushort)(crc1);

}

}

byte[]ret=BitConverter.GetBytes(crc);

Array.Reverse(ret);

returnret;

}

///**********************************************************************

///Name:CRC-16/MAXIM

x16+x15+x2+1

///Poly:0x8005

///Init:0x0000

///Refin:true

///Refout:true

///Xorout:0xFFFF

///*************************************************************************

publicstaticbyte[]Crc17(byte[]buffer,intstart=0,intlen=0)

{

if(buffer==null||buffer.Length==0)returnnull;

if(start0)returnnull;

if(len==0)len=buffer.Length-start;

intlength=start+len;

if(lengthbuffer.Length)returnnull;

ushortcrc=0;//Initialvalue

for(inti=start;ilength;i++)

{

crc^=buffer[i];

for(intj=0;jj++)

{

if((crc1)0)

crc=(ushort)((crc1)^0xA001);//0xA001=reverse0x8005

else

crc=(ushort)(crc1);

}

}

byte[]ret=BitConverter.GetBytes((ushort)~crc);

Array.Reverse(ret);

returnret;

}

///**********************************************************************

///Name:CRC-16/MODBUS

x16+x15+x2+1

///Poly:0x8005

///Init:0xFFFF

///Refin:true

///Refout:true

///Xorout:0x0000

///*************************************************************************

publicstaticbyte[]Crc18(byte[]buffer,intstart=0,intlen=0)

{

if(buffer==null||buffer.Length==0)returnnull;

if(start0)returnnull;

if(len==0)len=buffer.Length-start;

intlength=start+len;

if(lengthbuffer.Length)returnnull;

ushortcrc=0xFFFF;//Initialvalue

for(inti=start;ilength;i++)

{

crc^=buffer[i];

for(intj=0;jj++)

{

if((crc1)0)

crc=(ushort)((crc1)^0xA001);//0xA001=reverse0x8005

else

crc=(ushort)(crc1);

}

}

byte[]ret=BitConverter.GetBytes(crc);

Array.Reverse(ret);

returnret;

}

///**********************************************************************

///Name:CRC-16/USB

x16+x15+x2+1

///Poly:0x8005

///Init:0xFFFF

///Refin:true

///Refout:true

///Xorout:0xFFFF

///*************************************************************************

publicstaticbyte[]Crc19(byte[]buffer,intstart=0,intlen=0)

{

if(buffer==null||buffer.Length==0)returnnull;

if(start0)returnnull;

if(len==0)len=buffer.Length-start;

intlength=start+len;

if(lengthbuffer.Length)returnnull;

ushortcrc=0xFFFF;//Initialvalue

for(inti=start;ilength;i++)

{

crc^=buffer[i];

for(intj=0;jj++)

{

if((crc1)0)

crc=(ushort)((crc1)^0xA001);//0xA001=reverse0x8005

else

crc=(ushort)(crc1);

}

}

byte[]ret=BitConverter.GetBytes((ushort)~crc);

Array.Reverse(ret);

returnret;

}

///**********************************************************************

///Name:CRC-16/X25

x16+x12+x5+1

///Poly:0x1021

///Init:0xFFFF

///Refin:true

///Refout:true

///Xorout:0xFFFF

///*************************************************************************

publicstaticbyte[]Crc20(byte[]buffer,intstart=0,intlen=0)

{

if(buffer==null||buffer.Length==0)returnnull;

if(start0)returnnull;

if(len==0)len=buffer.Length-start;

intlength=start+len;

if(lengthbuffer.Length)returnnull;

ushortcrc=0xFFFF;//Initialvalue

for(inti=start;ilength;i++)

{

crc^=buffer[i];

for(intj=0;jj++)

{

if((crc1)0)

crc=(ushort)((crc1)^0x8408);//0x8408=reverse0x1021

else

crc=(ushort)(crc1);

}

}

byte[]ret=BitConverter.GetBytes((ushort)~crc);

Array.Reverse(ret);

returnret;

}

///**********************************************************************

///Name:CRC-16/XMODEM

x16+x12+x5+1

///Poly:0x1021

///Init:0x0000

///Refin:false

///Refout:false

///Xorout:0x0000

///*************************************************************************

publicstaticbyte[]Crc21(byte[]buffer,intstart=0,intlen=0)

{

if(buffer==null||buffer.Length==0)returnnull;

if(start0)returnnull;

if(len==0)len=buffer.Length-start;

intlength=start+len;

if(lengthbuffer.Length)returnnull;

ushortcrc=0;//Initialvalue

for(inti=start;ilength;i++)

{

crc^=(ushort)(buffer[i]8);

for(intj=0;jj++)

{

if((crc0x8000)0)

crc=(ushort)((crc1)^0x1021);

else

crc=(ushort)(crc1);

}

}

byte[]ret=BitConverter.GetBytes(crc);

Array.Reverse(ret);

returnret;

}

///**********************************************************************

///Name:CRC32

x32+x26+

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論