🔄 字节转换
Snet 的字节转换系统处理协议和设备之间的字节序(端序)差异。
DataFormat(字节序)
| 格式 | 名称 | 描述 | 示例 (0x12345678) |
|---|---|---|---|
ABCD |
大端序 | 高字节在前 | 12 34 56 78 |
BADC |
字交换大端序 | 每16位字交换 | 34 12 78 56 |
CDAB |
字交换 | 16 位字交换(低字在前) | 56 78 12 34 |
DCBA |
小端序 | 完全倒序 | 78 56 34 12 |
使用方法
var basics = new ModbusData.Basics
{
IpAddress = "192.168.1.100",
Port = 502,
DataFormat = Snet.Driver.Core.DataFormat.CDAB,
IsStringReverse = false,
};
BytesTransformHandler
BytesTransformHandler 根据 AddressDetails 配置(DataType、Length、DataFormat)自动将原始字节数组解析为 ConcurrentDictionary<string, AddressValue>。支持从 Bool 到 Double 的所有类型。
EncodingType(编码类型)
| 编码 | 代码页 |
|---|---|
UTF8 |
65001 |
Unicode(UTF-16) |
1200 |
BigEndianUnicode(UTF-16 大端) |
1201 |
UTF32 |
12000 |
BigEndianUTF32(UTF-32 大端) |
12001 |
ASCII |
20127 |
ANSI |
0(26.235.x 起映射 GBK/GB2312 936——0 不是合法代码页) |
GB2312 |
936 |
大端编码
BigEndianUnicode / BigEndianUTF32 解析为真实 .NET Encoding 实例(Encoding.BigEndianUnicode / 无 BOM 的 UTF-32 大端)——代码页 1201/12001 不是 .NET 已注册代码页,直接 Encoding.GetEncoding(代码页) 会抛异常。这正是西门子 WString(UTF-16 大端)解包可用的原因。GetEncoding() 对 null 的 EncodingType? 返回 UTF8。
BytesHandler.Transform / TransformAsync
BytesHandler(单例,Snet.Core.handler)将组包批次的原始字节解析回各地址的值:
编码说明(26.236.x 起)
BytesHandler 静态构造函数注册 CodePagesEncodingProvider.Instance——类型首次使用即注册,GB2312/GBK(936)与 GB18030(54936)立即可解析,解包 GB2312 编码字符串无需手动调用 Encoding.RegisterProvider。
public OperateResult Transform(AddressValue addressValue, bool isStringReverseByteWord = false);
public Task<OperateResult> TransformAsync(AddressValue addressValue, bool isStringReverseByteWord = false, CancellationToken token = default);
public OperateResult Transform(byte[] bytes, DateTime time, IEnumerable<BytesModel> transformParams, bool isStringReverseByteWord = false);
public Task<OperateResult> TransformAsync(byte[] bytes, DateTime time, IEnumerable<BytesModel> transformParams, bool isStringReverseByteWord = false, CancellationToken token = default);
| 参数 | 描述 |
|---|---|
isStringReverseByteWord |
String 解包时是否按 16 位字反转字节(每 2 字节一组交换)。连接级配置——如欧姆龙 FINS 的字符串按字反转字节读取。默认 false |
