物联网:C# Socket发送接收字节数组和十六16进制之间转换函数

本文提供了一种简便的方法,用于在C#中将16进制字符串转换为字节数组,以及反之亦然。通过两个实用函数,HexStrTobyte和byteToHexStr,使得在使用Socket发送数据时,远程模块指令的处理更为直观和高效。

近期在使用远程网络模块的时候,

需要用的Socket发送数据,远程模块指令为16进制。

官方提供的DEMO比较繁琐。不方便新手使用。

下面的转换函数可大大方便新手使用。

 

// 16进制字符串转字节数组   格式为 string sendMessage = "00 01 00 00 00 06 FF 05 00 64 00 00";
        private static byte[] HexStrTobyte(string hexString)
        {
            hexString = hexString.Replace(" ", "");
            if ((hexString.Length % 2) != 0)
                hexString += " ";
            byte[] returnBytes = new byte[hexString.Length / 2];
            for (int i = 0; i < returnBytes.Length; i++)
                returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2).Trim(), 16);
            return returnBytes;
        }


        // 字节数组转16进制字符串   
        public static string byteToHexStr(byte[] bytes)
        {
            string returnStr = "";
            if (bytes != null)
            {
                for (int i = 0; i < bytes.Length; i++)
                {
                    returnStr += bytes[i].ToString("X2");//ToString("X2") 为C#中的字符串格式控制符
                }
            }
            return returnStr;
        }
        //字节数组转16进制更简单的,利用BitConverter.ToString方法
        //string str0x = BitConverter.ToString(result, 0, result.Length).Replace("-"," ");

 

 

ToString("X2") 为C#中的字符串格式控制符

X为     十六进制
2为     每次都是两位数

比如   0x0A ,若没有2,就只会输出0xA 
假设有两个数10和26,正常情况十六进制显示0xA、0x1A,这样看起来不整齐,为了好看,可以指定"X2",这样显示出来就是:0x0A、0x1A。

C# 中通过 UDP 接收 16 进制数据后,通常需要将接收到的字节数组转换16 进制字符串以便于解析处理。以下是一个完整的转换方法,包含示例代码,展示了如何将接收到的 `byte[]` 数据转换为格式化的 16 进制字符串。 ### 将字节数组转换16 进制字符串 ```csharp public static string ByteArrayToHexString(byte[] bytes) { if (bytes == null || bytes.Length == 0) return string.Empty; StringBuilder hexBuilder = new StringBuilder(); foreach (byte b in bytes) { hexBuilder.AppendFormat("{0:X2}", b); // 转换为大写16进制格式 } return hexBuilder.ToString(); } ``` 该方法通过 `StringBuilder` 构建最终的 16 进制字符串。每个字节使用 `ToString("X2")` 方法转换为两位大写十六进制字符串。如果需要小写格式,可以使用 `"x2"` 替代 `"X2"`。 ### 使用示例 在 UDP 接收数据的场景中,通常会使用 `UdpClient` 来接收数据包。以下是一个完整的接收转换示例: ```csharp using System; using System.Net; using System.Net.Sockets; using System.Text; class UdpReceiverExample { static void Main() { UdpClient udpClient = new UdpClient(11000); // 绑定到本地端口11000 IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); try { Console.WriteLine("等待接收数据..."); byte[] receivedBytes = udpClient.Receive(ref remoteEndPoint); Console.WriteLine("接收到数据来自: " + remoteEndPoint.ToString()); string hexString = ByteArrayToHexString(receivedBytes); Console.WriteLine("接收到的16进制数据: " + hexString); } catch (Exception ex) { Console.WriteLine("发生错误: " + ex.Message); } finally { udpClient.Close(); } } public static string ByteArrayToHexString(byte[] bytes) { if (bytes == null || bytes.Length == 0) return string.Empty; StringBuilder hexBuilder = new StringBuilder(); foreach (byte b in bytes) { hexBuilder.AppendFormat("{0:X2}", b); } return hexBuilder.ToString(); } } ``` ### 16 进制字符串转字节数组 如果需要将接收到的 16 进制字符串还原为字节数组,例如用于进一步的协议解析或数据处理,可以使用以下方法: ```csharp public static byte[] HexStringToByteArray(string hexString) { hexString = hexString.Replace(" ", ""); // 去除空格 if (hexString.Length % 2 != 0) throw new ArgumentException("输入的16进制字符串长度必须为偶数"); int length = hexString.Length / 2; byte[] bytes = new byte[length]; for (int i = 0; i < length; i++) { string hexPair = hexString.Substring(i * 2, 2); bytes[i] = Convert.ToByte(hexPair, 16); } return bytes; } ``` 该方法首先去除字符串中的空格,然后逐对解析字符串中的每两个字符为一个字节。如果输入字符串长度为奇数,则抛出异常,因为每个字节由两个 16 进制字符表示。 ### 数据处理流程总结 1. **接收数据**:通过 `UdpClient.Receive()` 接收字节数组。 2. **转换16进制字符串**:便于调试协议分析。 3. **根据需要转换字节数组**:用于进一步的数据解析或发送。 以上方法均基于 C# 标准库实现,无需依赖第三方库,适用于大多数物联网、通信协议开发等场景[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值