庆祝开通blog,同时记下C#中如何进行CRC校验与浮点数的转换
2007-02-14 11:47
405 查看
源于CSDN
[align=left]CRC 校验算法C#实现一 ——接口实现 [/align]
[align=left]CRC 校验有 CRC 8位 16位 32位所以在实现这些校验算发之前,先实现它们的接口!
using System; [/align]
[align=left]namespace CRC
{
public interface ICRC
{
long Value
{
get;
}
void Reset();
void Crc(int bval);
void Crc(byte[] buffer);
void Crc(byte[] buf, int off, int len); [/align]
[align=left] }
} [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]CRC 校验算法C#实现三 ——16位校验算法 [/align]
[align=left]using System;[/align]
[align=left]namespace CRC
{
/// <summary>
/// CRC16 的摘要说明。
/// </summary>
public class CRC16:ICRC
{
#region CRC 16 位校验表
/// <summary>
/// 16 位校验表 Upper 表
/// </summary>
public ushort[] uppercrctab = new ushort[]
{
0x0000,0x1231,0x2462,0x3653,0x48c4,0x5af5,0x6ca6,0x7e97,
0x9188,0x83b9,0xb5ea,0xa7db,0xd94c,0xcb7d,0xfd2e,0xef1f
}; [/align]
[align=left] /// <summary>
/// 16 位校验表 Lower 表
/// </summary>
public ushort[] lowercrctab = new ushort[]
{
0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef
};
#endregion [/align]
[align=left] ushort crc = 0;[/align]
[align=left] /// <summary>
/// 校验后的结果
/// </summary>
public long Value
{
get
{
return crc;
}
set
{
crc = (ushort)value;
}
} [/align]
[align=left] /// <summary>
/// 设置crc 初始值
/// </summary>
public void Reset()
{
crc = 0;
}
/// <summary>
/// Crc16
/// </summary>
/// <param name="ucrc"></param>
/// <param name="buf"></param>
public void Crc(ushort ucrc,byte[] buf)
{
crc = ucrc;
Crc(buf);
}
/// <summary>
/// Crc16
/// </summary>
/// <param name="bval"></param>
public void Crc(int bval)
{
ushort h = (ushort)((crc >> 12) & 0x0f);
ushort l = (ushort)((crc >> 8 ) & 0x0f);
ushort temp = crc;
temp =(ushort)(((temp & 0x00ff) << 8) | bval);
temp =(ushort)(temp ^(uppercrctab[(h -1) + 1] ^ lowercrctab[(l - 1) + 1]));
crc = temp;
} [/align]
[align=left]
/// <summary>
/// Crc16
/// </summary>
/// <param name="buffer"></param>
public void Crc(byte[] buffer)
{
Crc(buffer,0,buffer.Length);
} [/align]
[align=left] /// <summary>
/// Crc16
/// </summary>
/// <param name="buf"></param>
/// <param name="off"></param>
/// <param name="len"></param>
public void Crc(byte[] buf,int off,int len)
{
if (buf == null)
{
throw new ArgumentNullException("buf");
}
if (off < 0 || len < 0 || off + len > buf.Length)
{
throw new ArgumentOutOfRangeException();
}
for (int i = off; i < len ; i ++)
{
Crc(buf[i]);
}
} [/align]
[align=left] [/align]
[align=left] }
} [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
调用CRC16 的一个例子
[align=left]
[/align]
[align=left]CRC16 crc = new CRC16();
crc.Reset();
crc.Crc(buf,0,DataPack.NextPackDataByteCount - 2);
crc.Crc(0);
crc.Crc(0);
buf[DataPack.NextPackDataByteCount - 2] = (byte)((crc.Value >> 8) & 0xff);
buf[DataPack.NextPackDataByteCount - 1] = (byte)((crc.Value & 0xff));[/align]
FLOAT_HEX HEX_FLOAT
float vDouble =77.79F;
Text = BitConverter.ToString(BitConverter.GetBytes(vDouble)).Replace("-", " ");
string m=Text.Replace(" ", "");//如果中间有空格
int len = m.Length/2;
byte[] arr = new byte[len];
for(int i=0;i<len;i++)
{
arr[i] = Convert.ToByte(m.Substring(i*2,2),16);
}
float f1 = BitConverter.ToSingle(arr,0);
[align=left]CRC 校验算法C#实现一 ——接口实现 [/align]
[align=left]CRC 校验有 CRC 8位 16位 32位所以在实现这些校验算发之前,先实现它们的接口!
using System; [/align]
[align=left]namespace CRC
{
public interface ICRC
{
long Value
{
get;
}
void Reset();
void Crc(int bval);
void Crc(byte[] buffer);
void Crc(byte[] buf, int off, int len); [/align]
[align=left] }
} [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]CRC 校验算法C#实现三 ——16位校验算法 [/align]
[align=left]using System;[/align]
[align=left]namespace CRC
{
/// <summary>
/// CRC16 的摘要说明。
/// </summary>
public class CRC16:ICRC
{
#region CRC 16 位校验表
/// <summary>
/// 16 位校验表 Upper 表
/// </summary>
public ushort[] uppercrctab = new ushort[]
{
0x0000,0x1231,0x2462,0x3653,0x48c4,0x5af5,0x6ca6,0x7e97,
0x9188,0x83b9,0xb5ea,0xa7db,0xd94c,0xcb7d,0xfd2e,0xef1f
}; [/align]
[align=left] /// <summary>
/// 16 位校验表 Lower 表
/// </summary>
public ushort[] lowercrctab = new ushort[]
{
0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef
};
#endregion [/align]
[align=left] ushort crc = 0;[/align]
[align=left] /// <summary>
/// 校验后的结果
/// </summary>
public long Value
{
get
{
return crc;
}
set
{
crc = (ushort)value;
}
} [/align]
[align=left] /// <summary>
/// 设置crc 初始值
/// </summary>
public void Reset()
{
crc = 0;
}
/// <summary>
/// Crc16
/// </summary>
/// <param name="ucrc"></param>
/// <param name="buf"></param>
public void Crc(ushort ucrc,byte[] buf)
{
crc = ucrc;
Crc(buf);
}
/// <summary>
/// Crc16
/// </summary>
/// <param name="bval"></param>
public void Crc(int bval)
{
ushort h = (ushort)((crc >> 12) & 0x0f);
ushort l = (ushort)((crc >> 8 ) & 0x0f);
ushort temp = crc;
temp =(ushort)(((temp & 0x00ff) << 8) | bval);
temp =(ushort)(temp ^(uppercrctab[(h -1) + 1] ^ lowercrctab[(l - 1) + 1]));
crc = temp;
} [/align]
[align=left]
/// <summary>
/// Crc16
/// </summary>
/// <param name="buffer"></param>
public void Crc(byte[] buffer)
{
Crc(buffer,0,buffer.Length);
} [/align]
[align=left] /// <summary>
/// Crc16
/// </summary>
/// <param name="buf"></param>
/// <param name="off"></param>
/// <param name="len"></param>
public void Crc(byte[] buf,int off,int len)
{
if (buf == null)
{
throw new ArgumentNullException("buf");
}
if (off < 0 || len < 0 || off + len > buf.Length)
{
throw new ArgumentOutOfRangeException();
}
for (int i = off; i < len ; i ++)
{
Crc(buf[i]);
}
} [/align]
[align=left] [/align]
[align=left] }
} [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
调用CRC16 的一个例子
[align=left]
[/align]
[align=left]CRC16 crc = new CRC16();
crc.Reset();
crc.Crc(buf,0,DataPack.NextPackDataByteCount - 2);
crc.Crc(0);
crc.Crc(0);
buf[DataPack.NextPackDataByteCount - 2] = (byte)((crc.Value >> 8) & 0xff);
buf[DataPack.NextPackDataByteCount - 1] = (byte)((crc.Value & 0xff));[/align]
FLOAT_HEX HEX_FLOAT
float vDouble =77.79F;
Text = BitConverter.ToString(BitConverter.GetBytes(vDouble)).Replace("-", " ");
string m=Text.Replace(" ", "");//如果中间有空格
int len = m.Length/2;
byte[] arr = new byte[len];
for(int i=0;i<len;i++)
{
arr[i] = Convert.ToByte(m.Substring(i*2,2),16);
}
float f1 = BitConverter.ToSingle(arr,0);
相关文章推荐
- c#如何将一个整数转换二进制,并进行位运算
- C#中如何将字符串转换成流,同时如何将流转换成字符串?
- c#如何将一个整数转换二进制,并进行位运算
- C#中如何将字符串转换byte[],同时如何将byte[]换成字符串?
- C# 中如何将List<string>里的集合转换成字符串并按指定的字符进行分隔?
- 比如将一个变量转换到INT类型 C#.NET中如何进行强制类型转换
- C#中如何将字符串转换byte[],同时如何将byte[]换成字符串?
- C#中如何将字符串转换byte[],同时如何将byte[]换成字符串?
- C#中如何将字符串转换成流,同时如何将流转换成字符串?
- C#中如何将字符串转换byte[],同时如何将byte[]换成字符串!
- C#中如何将字符串转换byte[],同时如何将byte[]换成字符串?
- 如何在C#中进行音频格式转换
- C#中如何实现AVI视频的播放并且需要在播放视频的同时在视频上进行一些简单线条的绘制?
- C#中如何将字符串转换成流,同时如何将流转换成字符串
- 如何在DOS/Windows和Linux/Unix之间进行文件格式转换?
- 用opencv计算棋盘格内角点坐标(通过4个内角点获得转换矩阵),并同时用halcon和opnecv对图像进行透视变换
- C#中如何进行远程调用别人的接口
- 庆祝我的blog正式开通!!!
- C#中可以与java进行互相转换的3des的加密和解密
- 【转载】如何:在各种字符串类型之间进行转换