C#short 、ushort、 byte、 byte[]转换分析

本文介绍了在C#编程中,如何进行ushort数组到byte数组的转换,包括直接转换、通过16进制字符串间接转换以及ushort与byte之间的互转,以处理modbus通信中接收到的ushort数据.

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关键字:

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);
		}
		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值