关键字:
1.C#数据类型转换
2.short转byte
3.modbus通信解析
之前有写过modbus通信,对数据处理这块做个回顾,因为使用了第三方库,返回数据是ushort[],在这摸索一下其他的数据转换知识,modbus rtu 通信链接:http://t.csdnimg.cn/zR8Ug
下面贴出测试代码,配合注释参考:
static void Main(string[] args)
{
ushort[] data = { 30};
ushort[] data2 = { 3002 };
Console.WriteLine("Hello, World!");
byte[] b2 = new byte[] { 0x12, 0x11 };
//下面两句是判断字节数组转ushort的方法
//注意下面结果输出一致,自带反转可能是因为BitConverter.IsLittleEndian结果为true?
Console.WriteLine(BitConverter.ToInt16(b2));
Console.WriteLine(ByteArrayToReverseHexString(b2));
//下面是判断ushort数组转字节数组的方法
//ushort数组直接转字节数组
//byte最大表示到2^8,这里3002太大就会报错,小于256的数可以转换,因为Array.ConvertAll转换前后保持个数一致?
byte[] byteArray = Array.ConvertAll<ushort, byte>(data, Convert.ToByte);
//先转16进制字符串再转字节数组
var bytesByHex = HexStringToByteArray(data[0].ToString("X4"));
//查看结果是否一致
Console.WriteLine(Enumerable.SequenceEqual(byteArray, bytesByHex));
//下面是ushort与字节数组互转的方法
var bytes = ShortToByte((short)data[0]);
var sValue = ByteToShort(bytes);
}
/// <summary>
/// Byte[] Reverse 2 Hex
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
public static int ByteArrayToReverseHexString(byte[] bytes)
{
if (bytes.Length > 0)
{
var byteTemp = ReverseByteArray(bytes);
//hex
var hex = BitConverter.ToString(byteTemp).Replace("-", "");
return Convert.ToInt32(hex, 16);
}
return -1;
}
/// <summary>
/// 数组倒序排列
/// </summary>
/// <param name="elements">数组参数</param>
/// <returns></returns>
public static T[] ReverseByteArray<T>(T[] elements)
{
if (elements.Length > 0)
{
var left = 0;
var right = elements.Length - 1;
while (left < right)
{
(elements[left], elements[right]) = (elements[right], elements[left]);
left++;
right--;
}
}
return elements;
}
/// <summary>
/// Hex 2 Byte[]
/// </summary>
/// <param name="hexString"></param>
/// <returns></returns>
/// <exception cref="ArgumentException"></exception>
public static byte[] HexStringToByteArray(string hexString)
{
try
{
if (hexString == null || hexString.Length % 2 != 0)
{
throw new ArgumentException("无效的16进制字符串");
}
byte[] bytes = new byte[hexString.Length / 2];
for (int i = 0; i < hexString.Length; i += 2)
{
bytes[i / 2] = Convert.ToByte(hexString.Substring(i, 2), 16);
}
return bytes;
}
catch (Exception e)
{
return null;
}
}
/// <summary>
/// Short2Byte
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static byte[] ShortToByte(short value)
{
return BitConverter.GetBytes(value);
}
/// <summary>
/// Byte2Short
/// </summary>
/// <param name="arr"></param>
/// <returns></returns>
public static short ByteToShort(byte[] arr)
{
return BitConverter.ToInt16(arr, 0);
}