String To BCD 以及 BCD To String 方法

jjcl521 2010-06-07 11:26:25
String To BCD 以及 BCD To String 方法

求方法以及思路,谢谢
...全文
1623 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cs_op 2010-06-09
  • 打赏
  • 举报
回复
3楼,4楼
参数什么意思?
jjcl521 2010-06-07
  • 打赏
  • 举报
回复

//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
}
jjcl521 2010-06-07
  • 打赏
  • 举报
回复
谢谢 还没到这一步呢

我才用CRC校验呢
huangmin3956 2010-06-07
  • 打赏
  • 举报
回复
学习 学习
geniusatm4 2010-06-07
  • 打赏
  • 举报
回复
 /// <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;
}
捷哥1999 2010-06-07
  • 打赏
  • 举报
回复
继续贴代码:

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;
}
捷哥1999 2010-06-07
  • 打赏
  • 举报
回复
以前写的函数;

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;
}
烈火蜓蜻 2010-06-07
  • 打赏
  • 举报
回复
这个应该很简单吧,不过BCD有很多种编码

有8421码 5421码 2421码 余3码 余3循环码 等等

for(int i=0;i<Str.Length;i++)
{
int chr = (int)(Str[i]);
//然后把chr按十进制来分位,(比如 100以上,分三位,0-9 就一位, 10-99 就二位)然后用四位二进制来存储一个10进制数。
}
lzsh0622 2010-06-07
  • 打赏
  • 举报
回复
private string strToBCD(string str)
{
int x=Convert.ToInt64(str,16);
string strOut=x.Tostring("X2");
return strOut;
}

号码字符串与BCD编码互转

在C#中如何BCD码转换为字符串

110,500

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧