# Value-Expression 值表达式
| 作者 | 时间 | 版本 | 描述 |
| ------ | ------------- | ---- | --------------- |
| 黄杰添 | 2022年6月20日 | V1.0 | 初始版本 |
| 黄杰添 | 2022年10月8日 | V1.1 | 增加Enums表达式 |
值表达式的设计的初衷是为了支持物联网协议的报文解析/生成,是报文(Source) 和 值(Target)之间的解析层。最初基于水文协议的数据定义(eg. N(3.1)), VE表达式操作字符串数据源, 并最终解析成定义的泛型的值和值字符视图。
(string)003821 **--->** N(6,2) **--->** (double)38.21
## 1. VE表达式 格式说明
基本格式 `Type(Format) ` 由一个Type字符起始, 紧跟着括号内的Format表示Type的补充说明,根据Type字符的不同而不同
- Type 表示为该要素的数据类型 eg N表示BCD编码数字,S表示字符, B表示字节,T表示时间,A表示数组
- Format 表示该数据类型的补充定义,如 当Type=N Format可以是一个大于0的数字,如3.1 完整的 `N(3,1)` 表示总长3个字节的数字,小数点1位。更多示例参考 附录 B
## 2. VE表达式 Type列表
| Type标识符 | 类型说明 | 编解码 | 占位符支持 | 基本格式 | 完整示例 | 示例说明 |
| ---------- | ------------------------ | -------- | ------------------ | --------------------------------- | -------------------------------------- | ------------------------------------------------------------ |
| N | 数值
Number | | 不支持 | N(字符数[,小数位]) | N(6,1) | 6字符的数字 例如 016751 将翻译为 1675.1
小数位如不声明或小于0则为0 |
| S | 字符
String | | 支持非数字占位符 | S(字符数) | S(16)
S(4-2-2 2:2:2) | 16个字符的字符
14个字符的字符, 例如 20220617104300 会被解释为 2022-06-17 10:43:00 |
| HN | HEX数值
Number | HEX | 不支持 | HN(字符数[,小数位]) | HN(6,2) | 6字符的HEX数字 例如 016751 将翻译为 919.85
小数位如不声明或小于0则为0 |
| HS | Hex字符
String | HEX | 支持非数字占位符 | HS(字符数) | HS(48)
HS(4-2-2 2:2:2) | 24个字节的Hex字符
14个字节的HEX字符, 例如 3230323230363137313031363030 会被解释为 2022-06-17 10:43:00 |
| HF | HEX-FLOAT数值
Float | IEEE 754 | 不支持 | HF(字符数) | HF(8) | 8个字符的HEX-FLOAT字符,例如3F99999A 经IEEE754解码为 1.2 |
| E | 枚举值
String | | 不支持 | E(字符数,键-值...) | E(2,01-成功,02-失败) | 2个字符的枚举值,例如01翻译为成功, 02翻译为失败. 注意以 - 号区分, 如后续还有 - 号 仅仅取第一个 - 号 |
| T | 时间字符
Timestamp | | | T(字符数,解析格式[,展示格式]) | T(12,yyMMddHHmmss,yyyy-MM-dd HH:mm:ss) | 12个字符的字符,例如220711121212 按照 yyMMddHHmmss解析后展示为yyyy-MM-dd HH:mm:ss格式,最终结果为2022-07-11 12:12:12
展示格式如不声明则为解析格式 |
| B | 字节
byte[] | 不固定 | 不支持 | B(字符数[,编码格式]) | B(1024,HEX) | 1024个字符转换为HEX编码 = 512个字节,编码格式如不声明默认为UTF-8 |
| A | 数组
Object[] | 不固定 | 视数组元素类型而定 | A(Type(Format)) | A(HN(2),12) | 共24个字节的Hex数字, 拆分为12组,默认在数据解析完成后以逗号 ‘,’间隔 |
| C | 组合
List