c# – 解码字节数组

我想解码从modbus通信接收的字节数组.这是表示字节数组的十六进制字符串:

01 11 0C 46 57 35 32 39 37 30 31 52 30 2E 35 FE 27

我想分成3部分:

> 01 11 0C
> 46 57 35 32 39 37 30 31 52 30 2E 35
> FE 27

为了从字节转换为十六进制,我使用此方法:

 #region ByteToHex
    /// <summary>
    /// method to convert a byte array into a hex string
    /// </summary>
    /// <param name="comByte">byte array to convert</param>
    /// <returns>a hex string</returns>
    public string ByteToHex(byte[] comByte)
    {
        //create a new StringBuilder object
        StringBuilder builder = new StringBuilder(comByte.Length * 3);
        //loop through each byte in the array
        foreach (byte data in comByte)
            //convert the byte to a string and add to the stringbuilder
            builder.Append(Convert.ToString(data, 16).PadLeft(2, '0').PadRight(3, ' '));
        //return the converted value
        return builder.ToString().ToUpper();
    }

如何从该方法拆分返回的字符串以返回:
前3个字节是:

>服务器ID
>功能代码
>字节数

接下来的N个字节(见3.)是有效载荷;最后2个是CRC16.

我需要找到有效载荷;这是一个字符串.

解决方法:

将输入转换为十六进制字符串是没有意义的.您需要解码字节保存的信息.他们所持有的东西完全取决于您只是转述的文档.我会拍它:

public class ModbusRequest
{
    public byte ServerId { get; set; }
    public byte FunctionCode { get; set; }
    public string Payload { get; set; }
}

public ModbusRequest DecodeMessage(byte[] message)
{
    var result = new ModbusRequest();

    // Simply copy bytes 0 and 1 into the destination structure.
    result.ServerId = message[0];
    result.FunctionCode = message[1];

    byte stringLength = message[2];

    // Assuming ASCII encoding, see docs.
    result.Payload = Encoding.ASCII.GetString(message, 3, stringLength);

    // Get the CRC bytes.
    byte[] crc = new byte[2];
    Buffer.BlockCopy(message, 4 + stringLength, crc, 0, 2);

    // TODO: verify CRC.

    return result;

}

要验证CRC,请找出正在使用的格式.我建议使用classless-hasher来实现各种CRC变体.

上一篇:SQL server和postgresql差异


下一篇:Modbus tcp android应用程序