110,500
社区成员
发帖
与我相关
我的任务
分享
//CRC 校验 源于http://topic.csdn.net/u/20080507/11/f7e4b60c-4c99-4a7d-a48e-e8d064a801cc.html
private byte[] gen_crc(byte[] frame, int pos, int len)
{
byte c, treat, bcrc;
ushort wcrc = 0;
for (int i = pos; i < pos + len; i++)
{
c = frame[i];
for (int j = 0; j < 8; j++)
{
treat = (byte)(c & 0x80);
c <<= 1;
bcrc = (byte)((wcrc >> 8) & 0x80);
wcrc <<= 1;
if (treat != bcrc)
wcrc ^= 0x1021;
}
}
return BitConverter.GetBytes(wcrc);
}
private void button1_Click(object sender, EventArgs e)
{
byte[] buffer = new byte[11];
buffer[0] = 0x02;
buffer[1] = 0x30;
buffer[2] = 0x31;
buffer[3] = 0x30;
buffer[4] = 0x32;
buffer[5] = 0x34;
buffer[6] = 0x38;
buffer[7] = 0x31;
byte[] temps = gen_crc(buffer, 1, 7);
buffer[8] = temps[1];
buffer[9] = temps[0];
buffer[10] = 0x03;
Console.WriteLine(BitConverter.ToString(buffer)); // 02-30-31-30-32-34-38-31-4D-E5-03
}
/// <summary>
/// BCD码转为10进制串(阿拉伯数据)
/// </summary>
/// <param name="bytes">BCD码 </param>
/// <returns>10进制串 </returns>
public String bcd2Str(byte[] bytes)
{
StringBuilder temp = new StringBuilder(bytes.Length * 2);
for (int i = 0; i < bytes.Length; i++)
{
temp.Append((byte)((bytes[i] & 0xf0) >> 4));
temp.Append((byte)(bytes[i] & 0x0f));
}
return temp.ToString().Substring(0, 1).Equals("0") ? temp.ToString().Substring(1) : temp.ToString();
}
/// <summary>
/// 10进制串转为BCD码
/// </summary>
/// <param name="asc">10进制串 </param>
/// <returns>BCD码 </returns>
public byte[] str2Bcd(String asc)
{
int len = asc.Length;
int mod = len % 2;
if (mod != 0)
{
asc = "0" + asc;
len = asc.Length;
}
byte[] abt = new byte[len];
if (len >= 2)
{
len = len / 2;
}
byte[] bbt = new byte[len];
abt = System.Text.Encoding.ASCII.GetBytes(asc);
int j, k;
for (int p = 0; p < asc.Length / 2; p++)
{
if ((abt[2 * p] >= '0') && (abt[2 * p] <= '9'))
{
j = abt[2 * p] - '0';
}
else if ((abt[2 * p] >= 'a') && (abt[2 * p] <= 'z'))
{
j = abt[2 * p] - 'a' + 0x0a;
}
else
{
j = abt[2 * p] - 'A' + 0x0a;
}
if ((abt[2 * p + 1] >= '0') && (abt[2 * p + 1] <= '9'))
{
k = abt[2 * p + 1] - '0';
}
else if ((abt[2 * p + 1] >= 'a') && (abt[2 * p + 1] <= 'z'))
{
k = abt[2 * p + 1] - 'a' + 0x0a;
}
else
{
k = abt[2 * p + 1] - 'A' + 0x0a;
}
int a = (j << 4) + k;
byte b = (byte)a;
bbt[p] = b;
}
return bbt;
}
public static byte[] convert_Str_BCD_Left(byte[] srcByteArray, int maxSize)
{
if (srcByteArray == null || maxSize <= 0)
return null;
if (srcByteArray.Length <= 0)
return null;
if (srcByteArray.Length > maxSize)
return null;
byte[] convertByteArray = null;
if (srcByteArray.Length % 2 != 0)
{
if (srcByteArray.Length != 1)
{
convertByteArray = new byte[srcByteArray.Length - 1];
Array.Copy(srcByteArray, 0, convertByteArray, 0, srcByteArray.Length - 1);
}
else
{
convertByteArray = new byte[2];
convertByteArray[0] = srcByteArray[0];
convertByteArray[1] = 0x30;
}
}
else
convertByteArray = srcByteArray;
byte[] bcdByteArray = convert_DSP_To_HEX(convertByteArray);
if (bcdByteArray == null)
return null;
byte[] tmpByteArray = null;
if (srcByteArray.Length % 2 != 0)
{
if (srcByteArray.Length != 1)
{
tmpByteArray = new byte[srcByteArray.Length / 2 + 1];
tmpByteArray[tmpByteArray.Length - 1] = (byte)(((srcByteArray[srcByteArray.Length - 1] - (byte)0x30) << 4) & 0xF0);
Array.Copy(bcdByteArray, 0, tmpByteArray, 0, bcdByteArray.Length);
}
else
{
tmpByteArray = new byte[1];
tmpByteArray[0] = (byte)(((srcByteArray[0] - (byte)0x30) << 4) & 0xF0);
}
}
else
{
tmpByteArray = new byte[srcByteArray.Length / 2];
Array.Copy(bcdByteArray, 0, tmpByteArray, 0, bcdByteArray.Length);
}
byte[] destByteArray = null;
if (maxSize % 2 != 0)
destByteArray = new byte[maxSize / 2 + 1];
else
destByteArray = new byte[maxSize / 2];
clearByteArray(destByteArray, (byte)0x00);
Array.Copy(tmpByteArray, 0, destByteArray, 0, tmpByteArray.Length);
return destByteArray;
}
public static byte[] convert_Str_BCD_Right(byte[] srcByteArray, int maxSize)
{
if (srcByteArray == null || maxSize <= 0)
return null;
if (srcByteArray.Length <= 0)
return null;
if (srcByteArray.Length > maxSize)
return null;
byte[] convertByteArray = null;
if (srcByteArray.Length % 2 != 0)
{
if (srcByteArray.Length != 1)
{
convertByteArray = new byte[srcByteArray.Length - 1];
Array.Copy(srcByteArray, 1, convertByteArray, 0, srcByteArray.Length - 1);
}
else
{
convertByteArray = new byte[2];
convertByteArray[0] = 0x30;
convertByteArray[1] = srcByteArray[0];
}
}
else
convertByteArray = srcByteArray;
byte[] bcdByteArray = convert_DSP_To_HEX(convertByteArray);
if (bcdByteArray == null)
return null;
byte[] tmpByteArray = null;
if (srcByteArray.Length % 2 != 0)
{
if (srcByteArray.Length != 1)
{
tmpByteArray = new byte[srcByteArray.Length / 2 + 1];
tmpByteArray[0] = (byte)(srcByteArray[0] - (byte)0x30);
Array.Copy(bcdByteArray, 0, tmpByteArray, 1, bcdByteArray.Length);
}
else
{
tmpByteArray = new byte[1];
tmpByteArray[0] = (byte)(srcByteArray[0] - (byte)0x30); ;
}
}
else
{
tmpByteArray = new byte[srcByteArray.Length / 2];
Array.Copy(bcdByteArray, 0, tmpByteArray, 0, bcdByteArray.Length);
}
byte[] destByteArray = null;
if (maxSize % 2 != 0)
destByteArray = new byte[maxSize / 2 + 1];
else
destByteArray = new byte[maxSize / 2];
clearByteArray(destByteArray, (byte)0x00);
Array.Copy(tmpByteArray, 0, destByteArray, destByteArray.Length - tmpByteArray.Length, tmpByteArray.Length);
return destByteArray;
}
public static byte[] convert_BCD_To_Str(byte[] srcByteArray, int startPos, int maxSize)
{
if (srcByteArray == null || startPos < 0 || maxSize <= 0)
return null;
if (srcByteArray.Length <= 0)
return null;
int bcdBlockSize = 0;
if (maxSize % 2 != 0)
bcdBlockSize = maxSize / 2 + 1;
else
bcdBlockSize = maxSize / 2;
if (srcByteArray.Length - startPos - bcdBlockSize < 0)
return null;
byte[] destByteArray = new byte[maxSize];
clearByteArray(destByteArray, (byte)0x00);
if (maxSize % 2 != 0)
{
destByteArray[0] = (byte)(srcByteArray[0] + 0x20);
bcdBlockSize--;
}
byte[] tmpByteArray = new byte[bcdBlockSize];
if (maxSize % 2 != 0)
Array.Copy(srcByteArray, startPos + 1, tmpByteArray, 0, bcdBlockSize);
else
Array.Copy(srcByteArray, startPos, tmpByteArray, 0, bcdBlockSize);
byte[] hexByteArray = convert_HEX_To_DSP(tmpByteArray);
if (hexByteArray == null)
return null;
if (maxSize % 2 != 0)
Array.Copy(hexByteArray, 0, destByteArray, 1, hexByteArray.Length);
else
Array.Copy(hexByteArray, 0, destByteArray, 0, hexByteArray.Length);
return destByteArray;
}