12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- import 'dart:typed_data';
- import 'package:vid/us/vid_us_data_reader.dart';
- import 'package:vid/us/vid_us_image_data.dart';
- import 'vid_tag.dart';
- import 'vid_value.dart';
- import 'vid_value_element.dart';
- extension VidExtendedDataExt on VidUsImageData {
- /// 获取结构化扩展数据
- VidExtendedData? getStructExtendedData() {
- return VidExtendedData.fromBytes(extendedData);
- }
- }
- /// vid文件扩展数据实体
- class VidExtendedData {
- /// version tag
- static VidTag get versionTag => VidTag("Vid", "Version");
- /// version num
- static VidIntegerValueElement get versionValue => VidIntegerValueElement(1);
- late final Map<VidTag, IVidValue> data;
- VidExtendedData(Map<VidTag, IVidValue> tv) {
- data = tv;
- add(versionTag, versionValue);
- }
- void add(VidTag key, IVidValue value) {
- data[key] = value;
- }
- static VidExtendedData? fromBytes(Uint8List bytes) {
- if (bytes.isEmpty) return null;
- try {
- final reader = VidUsDataReader(bytes);
- final count = reader.readInt();
- if (count <= 0 || count > bytes.length) return null;
- final Map<VidTag, IVidValue> map = {};
- for (int cursor = 0; cursor < count; cursor++) {
- final key = reader.readString();
- final keys = key.split(',');
- if (keys.length != 3) {
- return null;
- }
- final vidTag = VidTag(keys[0], keys[1]);
- final valueStr = reader.readString();
- final valueTypeName = keys[2].toLowerCase();
- final valueType = ValueType.values
- .firstWhere((e) => e.name.toLowerCase() == valueTypeName);
- final vidValue = _convertStr2ValEle(valueType, valueStr);
- map[vidTag] = vidValue;
- }
- return VidExtendedData(map);
- } catch (e) {}
- return null;
- }
- static IVidValue _convertStr2ValEle(ValueType type, String value) {
- switch (type) {
- case ValueType.string:
- return VidStringValueElement(value);
- case ValueType.double:
- return VidDoubleValueElement(double.parse(value));
- case ValueType.float:
- return VidFloatValueElement(double.parse(value));
- case ValueType.integer:
- return VidIntegerValueElement(int.parse(value));
- case ValueType.long:
- return VidLongValueElement(int.parse(value));
- case ValueType.uint:
- return VidUintValueElement(int.parse(value));
- case ValueType.ulong:
- return VidUlongValueElement(int.parse(value));
- case ValueType.ushort:
- return VidUshortValueElement(int.parse(value));
- case ValueType.byte:
- return VidByteValueElement(int.parse(value));
- case ValueType.short:
- return VidShortValueElement(int.parse(value));
- }
- }
- }
|