Ⅰ java怎麼做CRC校驗的程序
實現方法:最簡單的校驗就是把原始數據和待比較數據直接進行比較,看是否完全一樣這種方法是最安全最准確的。同時也是效率最低的。
應用例子:龍珠cpu在線調試工具bbug.exe。它和龍珠cpu間通訊時,bbug發送一個位元組cpu返回收到的位元組,bbug確認是剛才發送位元組後才繼續發送下一個位元組的。 實現方法:在數據存儲和傳輸中,位元組中額外增加一個比特位,用來檢驗錯誤。校驗位可以通過數據位異或計算出來。
應用例子:單片機串口通訊有一模式就是8位數據通訊,另加第9位用於放校驗值。
bcc異或校驗法(block check character)
實現方法:很多基於串口的通訊都用這種既簡單又相當准確的方法。它就是把所有數據都和一個指定的初始值(通常是0)異或一次,最後的結果就是校驗值,通常把它附在通訊數據的最後一起發送出去。接收方收到數據後自己也計算一次異或和校驗值,如果和收到的校驗值一致就說明收到的數據是完整的。
校驗值計算的代碼類似於:
unsigned uCRC=0;//校驗初始值
for(int i=0;i<DataLenth;i++) uCRC^=Data[i];
適用范圍:適用於大多數要求不高的數據通訊。
應用例子:ic卡介面通訊、很多單片機系統的串口通訊都使用。 (Cyclic Rendancy Check)
實現方法:這是利用除法及余數的原理來進行錯誤檢測的
Ⅱ java中求16進制異或和
publicclassTest{
publicStringa;
publicstaticvoidmain(String[]args){
int[]a=newint[]{(int)0X8A,(int)0X12,(int)0X05,
(int)0X07,(int)0XFE,(int)0XE3,(int)0X0A,
(int)0X06,(int)0X10,(int)0X14,(int)0X29};
intChkSum=0;
for(inti=0;i<2;i++){//a.length,只有在為2時結果為98,也就是說只驗證了0X8A,0X12這2個數
ChkSum=(int)(ChkSum^a[i]);
}
System.out.println(Integer.toHexString(ChkSum)+"H");
}
}
N的輸入我就不寫了,自己給了一個固定值2,你把 i<2中的2替換成 輸入值就好
Ⅲ java checksum的校驗方式
public class CRC {
/**
* CRC-CCITT(Kermit)驗證模式
* @param str
* @return
*/
public String CRC_CCITT_Kermit(String str) {
int j, b, rrrc, c, i;
String tmpBalance;
int k;
rrrc = 0;
tmpBalance = str;
int tmpInt, CharInt;
String tmpChar, tmpStr;
tmpStr = "";
int High;
int Low;
for (j = 1; j <= 3; j++) {
if (Character.isDigit(tmpBalance.charAt(2 * j - 2))) {
High = Integer.parseInt(tmpBalance.charAt(2 * j - 2) + "");
} else {
High = 0;
}
if (Character.isDigit(tmpBalance.charAt(2 * j - 1))) {
Low = Integer.parseInt(tmpBalance.charAt(2 * j - 1) + "");
} else {
Low = 0;
}
High = (High & 0xff) << 4;
High = High | Low;
k = High;
for (i = 1; i <= 8; i++) {
c = rrrc & 1;
rrrc = rrrc >> 1;
if ((k & 1) != 0) {
rrrc = rrrc | 0x8000;
}
if (c != 0) {
rrrc = rrrc ^ 0x8408;
}
k = k >> 1;
}
}
for (i = 1; i <= 16; i++) {
c = rrrc & 1;
rrrc = rrrc >> 1;
if (c != 0) {
rrrc = rrrc ^ 0x8408;
}
}
c = rrrc >> 8;
b = rrrc << 8;
rrrc = c | b;
tmpInt = rrrc;
tmpStr = "";
for (i = 1; i <= 4; i++) {
tmpChar = "";
CharInt = tmpInt % 16;
if (CharInt > 9) {
switch (CharInt) {
case 10:
tmpChar = "A";
break;
case 11:
tmpChar = "B";
break;
case 12:
tmpChar = "C";
break;
case 13:
tmpChar = "D";
break;
case 14:
tmpChar = "E";
break;
case 15:
tmpChar = "F";
break;
}
} else {
tmpChar = Integer.toString(CharInt);
}
tmpInt = tmpInt / 16;
tmpStr = tmpChar + tmpStr;
}
System.out.println("tmpStr:" + tmpStr);
return tmpStr;
}
/**
* CRC-CCITT(XModem)
* CRC-CCITT(0xFFFF)
* CRC-CCITT(0x1D0F)
* 校驗模式
* @param flag< XModem(flag=1) 0xFFFF(flag=2) 0x1D0F(flag=3)>
* @param str
* @return
*/
public String CRC_CCITT( int flag,String str) {
int crc = 0x00; // initial value
int polynomial = 0x1021;
byte[] bytes=str.getBytes();
switch(flag){
case 1:
crc=0x00;
break;
case 2:
crc=0xFFFF;
break;
case 3:
crc=0x1D0F;
break;
}
for (int index = 0 ; index< bytes.length; index++) {
byte b = bytes[index];
for (int i = 0; i < 8; i++) {
boolean bit = ((b >> (7-i) & 1) == 1);
boolean c15 = ((crc >> 15 & 1) == 1);
crc <<= 1;
if (c15 ^ bit) crc ^= polynomial;
}
}
crc &= 0xffff;
str = Integer.toHexString(crc);
return str;
}
Ⅳ java中CRC演算法是個什麼東東
CRC演算法實現有2種方法,一、查表法,二、直接計算,查表法的計算速度相對來說比較快,本人介紹的方法是直接計演算法,用了2種方法實現,都是面向對象進行演算法的封裝。
package com.wms.serial;
/**
* @author lino
* @version 2006/08/25
*/
public class CRC16{
public int value;
public CRC16()
{
value = 0;
}
/** update CRC with byte b */
public void update(byte aByte)
{
int a, b;
a = (int) aByte;
for (int count = 7; count >=0; count--) {
a = a << 1;
b = (a >>>8) & 1;
if ((value & 0x8000) != 0) {
value = ((value << 1) + b) ^ 0x1021;
} else {
value = (value << 1) + b;
}
}
value = value & 0xffff;
return;
}
/** reset CRC value to 0 */
public void reset()
{
value = 0;
}
public int getValue()
{
return value;
}
public static void main(String[] args) {
CRC16 crc16 = new CRC16();
byte[] b = new byte[]{
//(byte) 0xF0,(byte)0xF0,(byte)0xF0,(byte)0x72
(byte) 0x2C,(byte)0x00,(byte)0xFF,(byte)0xFE
,(byte) 0xFE,(byte)0x04,(byte)0x00,(byte)0x00
,(byte) 0x00,(byte)0x00
};
for (int k = 0; k < b.length; k++)
{
crc16.update(b[k]);
}
System.out.println(Integer.toHexString(crc16.getValue()));
System.out.println(Integer.toHexString(b.length));
}
}
package com.wms.serial;
public class CRC162 {
public static final void main(String[] args){
CRC162 crc16 = new CRC162();
byte[] b = new byte[]{
//(byte) 0xF0,(byte)0xF0,(byte)0xF0,(byte)0x72
(byte) 0x2C,(byte)0x00,(byte)0xFF,(byte)0xFE
,(byte) 0xFE,(byte)0x04,(byte)0x00,(byte)0x00
,(byte) 0x00,(byte)0x00
};
System.out.println(Integer.toHexString(crc16.encode(b)));
//再把這個2f49替換成b數組的最後兩個位元組的數組,生成一個新的數組b2
byte[] b2 = new byte[]{
//(byte) 0xF0,(byte)0xF0,(byte)0xF0,(byte)0x72
(byte) 0x2C,(byte)0x00,(byte)0xFF,(byte)0xFE
,(byte) 0xFE,(byte)0x04,(byte)0x00,(byte)0x00
,(byte) 0x2f,(byte)0x49
};
System.out.println(Integer.toHexString(crc16.encode(b2))); //算出來是 0
//你可以自已構造一些byte進行加解密試試
}
public short encode(byte[] b){
short CRC_x = 0;
int pp = 65536; // 1<<16;
int pp2 = 69665; // (1<<16) + (1<<12) + (1<<5) + 1
for(int i=0;i<b.length;i++){
for(int j=0;j<8;j++){
CRC_x = (short)((CRC_x<<1) + (((b[i]<<j)&0x80)>>7));
if((CRC_x/pp) == 1){
CRC_x=(short)(CRC_x^pp2);
}
}
}
return CRC_x;
}
}
Ⅳ java 程序怎麼計算.hex文件校驗和
JAVA 讀進來,一樣相加
int n=0xff&(0x01 +~(0x02 + 00 + 00 + 0x02 + 0x12 + 00));
String a=Integer.toHexString(n);
System.out.println(a);
Ⅵ 用java實現UDP校驗和計算
public static void main(String[] arg) {
String str = "hello";
System.out.println(toByte(str));
// 得到結果:byte[] sbytes = { 0X68, 0X65, 0X6c, 0X6c, 0X6f };
}
private static String toByte(String str) {
byte[] bytes = str.getBytes();
StringBuffer sb = new StringBuffer();
sb.append("byte[] sbytes = { ");
for (int i = 0; i < bytes.length; i++) {
sb.append(String.format("0X%s", Integer.toHexString(bytes[i])));
if (i < bytes.length - 1) {
sb.append(", ");
}
}
sb.append(" };").append("\r\n");
return sb.toString();
}
Ⅶ java里如何正確計算檢驗和
importjava.security.MessageDigest;
publicclassMD5HashingExample
{
publicstaticvoidmain(String[]args)throwsException
{
Stringpassword="123456";
MessageDigestmd=MessageDigest.getInstance("MD5");
md.update(password.getBytes("UTF-8"));//orGBK
bytebyteData[]=md.digest();
//
StringBuffersb=newStringBuffer();
for(inti=0;i<byteData.length;i++){
sb.append(Integer.toString((byteData[i]&0xff)+0x100,16).substring(1));
}
System.out.println("Digest(inhexformat)::"+sb.toString());
//
StringBufferhexString=newStringBuffer();
for(inti=0;i<byteData.length;i++){
Stringhex=Integer.toHexString(0xff&byteData[i]);
if(hex.length()==1)hexString.append('0');
hexString.append(hex);
}
System.out.println("Digest(inhexformat)::"+hexString.toString());
}
}
Ⅷ java 如何計算校驗和,比如如下這段代碼如何修改
您好,1、 編寫一個計算機程序用來計算一個文件的16位效驗和。最快速的方法是用一個32位的整數來存放這個和。記住要處理進位(例如,超過16位的那些位),把它們加到效驗和中。
要求:1)以命令行形式運行:check_sum infile
其中check_sum為程序名,infile為輸入數據文件名。
2)輸出:數據文件的效驗和
附:效驗和(checksum)
原理:把要發送的數據看成二進制整數序列,並計算他們的和。若數據位元組長度為奇數,則在數據尾部補一個位元組的0以湊成偶數。
例子:16位效驗和計算,下圖表明一個小的字元串的16位效驗和的計算。
為了計算效驗和,發送計算機把每對字元當成16位整數處理並計算效驗和。如果效驗和大於16位,那麼把進位一起加到最後的效驗和中。
Ⅸ java 實現crc16校驗演算法的問題
貌似CRC演算法循環求余時減法是不帶借位的。
Ⅹ java的crc16校驗,按指定多項式,求助
可以寫的,參照附錄那個演算法用java代碼實現即可。