我想解码从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变体.