C#字节和字符的转换,以及校验和计算
来源:互联网 发布:mac定妆喷雾 编辑:程序博客网 时间:2024/05/21 11:31
#region 字符串和字节数组相互转换
/// <summary>
/// 将字符串转换成16进制字节数组,并自动在字节数组后面加cs校验和
/// </summary>
/// <param name="_data">要转换的string</param>
/// <param name="byteArray">转换之后的字节数组</param>
/// <returns>为空则表示执行正确,否则,表示错误信息</returns>
public
static
string
ChangeHexStringToByteArray(
string
_data,
out
byte
[] byteArray)
{
string
sResult =
""
;
byteArray =
null
;
if
(_data ==
""
)
{
sResult =
"请不要传入空值。函数:ChangeHexStringToByteArray。"
;
}
else
if
(_data.Length % 2 != 0)
{
sResult =
"请传入正确的十六进制字符串,字符串的个数必须是偶数个。函数:ChangeHexStringToByteArray。"
;
}
else
{
try
{
_data = _data.Replace(
" "
,
""
);
int
sendLength = _data.Length / 2;
byteArray =
new
byte
[sendLength];
string
hexstring =
""
;
int
k = 0;
for
(
int
i = 0; i < _data.Length; )
{
hexstring = _data.Substring(i, 2);
int
j;
j =
int
.Parse(hexstring, System.Globalization.NumberStyles.HexNumber);
byteArray[k] = (
byte
)j;
i += 2;
k++;
}
}
catch
(Exception ex)
{
sResult = ex.Message;
}
}
return
sResult;
}
/// <summary>
/// 将字节数组转换成十六进制字符串
/// </summary>
/// <param name="data">要转换的字节数组</param>
/// <param name="HexString">转换后的字符串</param>
/// <returns>为空则表示执行正确,否则,表示错误信息</returns>
public
static
string
ChangeByteArrayToHexString(
byte
[] data,
out
string
HexString)
{
string
sResult =
""
;
HexString =
""
;
StringBuilder sb =
new
StringBuilder(data.Length * 3);
try
{
foreach
(
byte
b
in
data)
sb.Append(Convert.ToString(b, 16).PadLeft(2,
'0'
).PadRight(3,
' '
));
}
catch
(Exception ex)
{
sResult =
"将字节数组转换成字符串时出错,函数:ChangeByteArrayToHexString。异常信息:"
+ ex.Message;
}
HexString = sb.ToString().ToUpper();
return
sResult;
}
#endregion
#region 计算校验和
/// <summary>
/// 对16进制数字的进行CRC16校验,然后把校验值返回
/// </summary>
/// <param name="str">要进行校验的数据</param>
/// <param name="CRC16Result">校验值(校验结果)</param>
/// <returns>为空则表示执行正确,否则,表示错误信息</returns>
public
string
GetCRC16ResultByHexString(
string
str,
string
CRC16Result)
{
ushort
crcResult;
byte
[] byArr;
string
sResult =
""
;
CRC16Result =
""
;
try
{
sResult = ChangeHexStringToByteArray(str,
out
byArr);
if
((sResult ==
""
) && (byArr !=
null
))
{
sResult= CalculateCRC(byArr, byArr.Length,
out
crcResult);
if
(sResult ==
""
)
{
ushort
h = (
byte
)(crcResult & 0xFF);
ushort
l = (
byte
)((crcResult & 0xFF00) >> 8);
string
height = Convert.ToString(h, 16);
string
low = Convert.ToString(l, 16);
if
(height.Length == 1)
height = height.Insert(0,
"0"
);
if
(low.Length == 1)
low = low.Insert(0,
"0"
);
CRC16Result = low.ToUpper() + height.ToUpper();
}
}
}
catch
(Exception ex)
{
sResult += ex.Message;
}
return
sResult;
}
/// <summary>
/// crc16算法
/// </summary>
/// <param name="pByte">要校验的字节数组</param>
/// <param name="nNumberOfBytes">字节个数</param>
/// <param name="pChecksum">校验结果</param>
/// <returns>为空则表示执行正确,否则,表示错误信息</returns>
public
static
string
CalculateCRC(
byte
[] pByte,
int
nNumberOfBytes,
out
ushort
pChecksum)
{
int
nBit;
ushort
nShiftedBit;
pChecksum = 0xFFFF;
string
sResult =
""
;
if
(nNumberOfBytes > pByte.Length)
{
sResult =
"传入的参数nNumberOfBytes(字节个数)大于pByte(要校验的字节数组)的长度"
;
}
else
{
try
{
for
(
int
nByte = 0; nByte < nNumberOfBytes; nByte++)
{
pChecksum ^= pByte[nByte];
for
(nBit = 0; nBit < 8; nBit++)
{
if
((pChecksum & 0x1) == 1)
{
nShiftedBit = 1;
}
else
{
nShiftedBit = 0;
}
pChecksum >>= 1;
if
(nShiftedBit != 0)
{
pChecksum ^= 0xA001;
}
}
}
}
catch
(Exception ex)
{
sResult = ex.Message;
}
}
return
sResult;
}
/// <summary>
/// 计算累加校验和
/// </summary>
/// <param name="SendByteArray">要校验的字节数组</param>
/// <returns>对字节数组进行校验所得到的校验和</returns>
public
static
byte
GetSumCS(
byte
[] SendByteArray)
{
byte
rst = 0x00;
//计算累加和
for
(
int
j = 2; j < SendByteArray.Length; j++)
{
unchecked
{
rst += SendByteArray[j];
}
}
//累加和计算结束
return
rst;
}
#endregion
0 0
- C#字节和字符的转换,以及校验和计算
- c#中字符和字节相互转换
- C#通过编码在字符和字节之间的转换
- c#计算十六进制字符串的和校验
- 字节流和字符流的转换
- 字符流和字节流之间的转换以及输入输出,详细分析
- C# 文件和字节流的转换
- java 计算sizeof,以及校验和
- 校验和的计算/校验算法
- java基础:字节流和字符流的转换
- JAVA中的字节流和字符流的转换
- 字符串对象和字节化字符数据之间的转换
- 字节流和字符流的相互转换
- Java中字节流和字符流之间的转换
- java中字节和字符的转换操作
- JAVA中的字节流和字符流的转换
- 网络的校验和计算
- io-字节和字符转换流
- 黑马程序员——Java基础---正则表达式
- NDK mk文件学习
- Oracle 并发更新大表
- ios 开发视频教程
- javescript循环(for…in…/Map和Set/函数/apply()与call()/map()/reduce()/filter()/sort())
- C#字节和字符的转换,以及校验和计算
- jvm 内存溢出 在myeclipse中加大tomcat的jvm内存 java.lang.OutOfMemoryError: PermGen space
- j2ee,jsp,servlet文件下载服务器端
- Servlet 3.0 新特性概览
- FLex 4.0 Module里面Alert.show();出错问题
- Android初级教程_获取Android控件的宽和高
- CSS3下实现边框阴影效果(下)-翘边阴影效果
- Android初体验之Monkey和MonkeyRunner
- swift实作app 交流分享八(self sizing cells)