String To BCD 以及 BCD To String 方法

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

求方法以及思路,谢谢
...全文
1898 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码转换为字符串
内容概要:本文出自罗兰贝格关于工业4.0现状的报告,系统分析了制造业在数字化转型过程中的实际进展与挑战。报告指出,尽管“工业4.0”概念提出已逾十年,但多数企业仍未实现预期的智能化、自组织生产目标,主要受限于技术复杂性、组织孤岛、投资回报周期长及人才短缺等问题。通过对领先制造企业的研究,报告提炼出三大成功要素:一是制定基于现实的工业4.0愿景与全面战略,明确用例优先级;二是建立“中心辐射式”组织架构,设立专职数字化制造部门,推动跨职能协作与规模化落地;三是构建统一的IT/OT目标架构,强化数据生态与系统互操作性。报告特别强调,高价值用例如预测性维护、实时参数优化、视觉检测等已在汽车与半导体行业显现显著成效,企业应聚焦可量化回报的场景,结合资源现实,分阶段推进转型。; 适合人群:制造业企业管理者、数字化转型负责人、工业互联网从业者及政策制定者; 使用场景及目标:①帮助企业评估自身工业4.0成熟度并制定务实发展战略;②为制造企业设计组织架构与IT/OT技术路线图提供参考;③指导资源优先配置于高价值数字化用例,提升投资回报率; 阅读建议:建议结合企业实际生产场景阅读,重点关注“中心辐射式”运营模式与六大高价值用例的适用性分析,同时参考报告中的汽车行业案例,因地制宜地规划数字化路径。

111,130

社区成员

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

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

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