字节转换 - Snet Docs

🔄 字节转换

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>。支持从 BoolDouble 的所有类型。

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()nullEncodingType? 返回 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

另请参阅