You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TCP封装XML消息的长度、ID及EOF字段实现疑问求助

C# TCP设备接口消息封装实现指导

核心字段实现细节

按照给定的规范,需将四个字段按顺序拼接为完整的TCP发送包,以下是每个字段的具体实现逻辑:

1. Message Length +2 字段

该字段为2字节大端无符号整数,值等于XML消息的UTF-8字节数加2。实现步骤:

  • 先将XML字符串转为UTF-8字节数组
  • 计算长度值:XML字节数 + 2
  • 转换为大端字节序列:借助IPAddress.HostToNetworkOrder将主机字节序转为网络字节序(即大端),确保跨平台兼容性

2. Message ID 字段

固定值8001,同样是2字节大端无符号整数,直接将8001转换为大端字节序列即可。

3. XML消息字段

保留你已实现的UTF-8编码逻辑即可,无需额外修改。

4. EOF字段

固定为单字节0xFF,直接构造字节数组new byte[] { 0xFF }即可。

完整代码示例

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class TcpDeviceClient
{
    public void SendEncapsulatedMessage(string xmlContent, string host, int port)
    {
        // 1. 把XML转为UTF-8字节数组
        byte[] xmlBytes = Encoding.UTF8.GetBytes(xmlContent);
        
        // 2. 构造Message Length +2字段(2字节大端)
        ushort lengthValue = (ushort)(xmlBytes.Length + 2);
        byte[] lengthBytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)lengthValue));
        
        // 3. 构造Message ID字段(固定8001,2字节大端)
        ushort messageId = 8001;
        byte[] idBytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)messageId));
        
        // 4. 构造EOF字段
        byte[] eofBytes = new byte[] { 0xFF };
        
        // 5. 拼接所有字段成完整数据包
        using (var ms = new System.IO.MemoryStream())
        {
            ms.Write(lengthBytes, 0, lengthBytes.Length);
            ms.Write(idBytes, 0, idBytes.Length);
            ms.Write(xmlBytes, 0, xmlBytes.Length);
            ms.Write(eofBytes, 0, eofBytes.Length);
            
            // 6. 通过TCP发送数据包
            using (TcpClient client = new TcpClient(host, port))
            using (NetworkStream stream = client.GetStream())
            {
                stream.Write(ms.ToArray(), 0, (int)ms.Length);
                stream.Flush();
            }
        }
    }
}

关键注意事项

  • 字节序校验:必须确保长度和ID字段为大端字节序,IPAddress.HostToNetworkOrder是跨平台的可靠实现,避免直接手动反转字节(不同系统主机字节序可能不同)。
  • 编码一致性:严格使用UTF-8编码XML,否则会导致长度计算错误,引发接口解析失败。
  • EOF位置:必须将EOF字段放在数据包的最后,不能遗漏或错位。

内容的提问来源于stack exchange,提问作者LaLa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 09:10:06