import 'dart:convert'; import 'dart:typed_data'; import 'package:crypto/crypto.dart'; import 'package:flutter/services.dart'; int listChangInt(List list){ int dataLen = (list[0] << 8) + list[1]; return dataLen; } List intChangList(int count){ List intList = []; double typeDouble = count / 256; int type1 = typeDouble.toInt(); int type2 = count % 256; intList.add(type1); intList.add(type2); return intList; } List changeIntListToStringList(List list){ List strList = []; for(int i = 0; i changeStringListToIntList(List list){ List intList = []; for(int i = 0; i= 48 && hexDigit <= 57) { val += (hexDigit - 48) * (1 << (4 * (len - 1 - i))); } else if (hexDigit >= 65 && hexDigit <= 70) { // A..F val += (hexDigit - 55) * (1 << (4 * (len - 1 - i))); } else if (hexDigit >= 97 && hexDigit <= 102) { // a..f val += (hexDigit - 87) * (1 << (4 * (len - 1 - i))); } else { throw FormatException("Invalid hexadecimal value"); } } return val; } String md5Crypto(List data) { final dig = md5.convert(data); var keyStr = dig.toString(); return keyStr.substring(0, 16).toLowerCase(); } // 获取固定长度的数组 List getFixedLengthList(List data, int length) { for (int i = 0; i < length; i++) { data.add(0); } return data; } //int ---> 指定长度的hex (如指定长度为6的情况,0x000001 0x001234, 0xefab23) String intToFormatHex(int num, int length) { String hexString = num.toRadixString(16); String formatString = hexString.padLeft(length, "0"); return formatString; } String uint8ToHex(Uint8List byteArr) { if (byteArr.isEmpty) { return ""; } Uint8List result = Uint8List(byteArr.length << 1); var hexTable = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' ]; //16进制字符表 for (var i = 0; i < byteArr.length; i++) { var bit = byteArr[i]; //取传入的byteArr的每一位 var index = bit >> 4 & 15; //右移4位,取剩下四位 var i2 = i << 1; //byteArr的每一位对应结果的两位,所以对于结果的操作位数要乘2 result[i2] = hexTable[index].codeUnitAt(0); //左边的值取字符表,转为Unicode放进resut数组 index = bit & 15; //取右边四位 result[i2 + 1] = hexTable[index].codeUnitAt(0); //右边的值取字符表,转为Unicode放进resut数组 } return String.fromCharCodes(result); //Unicode转回为对应字符,生成字符串返回 } //TODO:int->两个字节 List 低字节在前,高字节在后(大端存储)=>嵌入式小端接收(协议用到) int byteInt8(List dataDetail, int index) => _toInt8(dataDetail[index]); int _toInt8(int value) { var buffer = Int8List(4).buffer; var bData = ByteData.view(buffer); bData.setInt8(0, value); return bData.getInt8(0); } int byteInt16(List dataDetail, int index) => _byteInt16(dataDetail, index); int _byteInt16(List dataDetail, int index) { if (checkListIndex(dataDetail, index, 2)) { return 0; } int value = (dataDetail[index + 1] & 0xff) << 8 | (dataDetail[index] & 0xff); return _toInt16(value); } int _toInt16(int value) { var buffer = Int16List(1).buffer; var bData = ByteData.view(buffer); bData.setInt16(0, value); int outputValue = bData.getInt16(0); return outputValue; } int byteInt32(List dataDetail, int index) => _byteInt32(dataDetail, index); int _byteInt32(List dataDetail, int index) { if (checkListIndex(dataDetail, index, 4)) { return 0; } int value = ((0xFF & dataDetail[(index + 3)]) << 24 | (0xFF & dataDetail[index + 2]) << 16 | (0xFF & dataDetail[index + 1]) << 8 | 0xFF & dataDetail[index]); return _toInt32(value); } int _toInt32(int value) { var buffer = Int32List(2).buffer; var bData = ByteData.view(buffer); bData.setInt32(0, value); int outputValue = bData.getInt32(0); return outputValue; } List intToInt8List(int value) => [value]; List intToByte2ListHigh(int value) => [value, value >> 8]; //TODO:int->4个字节List 低字节在前,高字节在后(大端存储) 1byte = 8bit List intToByte4ListHigh(int value) => [value, value >> 8, value >> 16, value >> 24]; int byteUInt8(List dataDetail, int index) => _toUInt8(dataDetail[index]); int _toUInt8(int value) { var buffer = Int8List(1).buffer; var bData = ByteData.view(buffer); bData.setInt8(0, value); return bData.getUint8(0); } int byteUInt16(List dataDetail, int index) => _byteUInt16(dataDetail, index); _byteUInt16(List dataDetail, int index) { if (checkListIndex(dataDetail, index, 2)) { return 0; } int value = (dataDetail[index + 1]) << 8 | dataDetail[index]; return _toUInt16(value); } int _toUInt16(int value) { var buffer = Uint16List(2).buffer; var bData = ByteData.view(buffer); bData.setInt16(0, value); return bData.getUint16(0); } int byteUInt32(List dataDetail, int index) => _byteUInt32(dataDetail, index); int _byteUInt32(List dataDetail, int index) { if (checkListIndex(dataDetail, index, 4)) { return 0; } int value = ((0xFF & dataDetail[(index + 3)]) << 24 | (0xFF & dataDetail[index + 2]) << 16 | (0xFF & dataDetail[index + 1]) << 8 | 0xFF & dataDetail[index]); return _toUInt32(value); } int _toUInt32(int value) { var buffer = Int32List(2).buffer; var bData = ByteData.view(buffer); bData.setInt32(0, value); int outputValue = bData.getUint32(0); return outputValue; } bool checkListIndex(List dataDetail, int index, int offsetLength) { if (dataDetail == null) { return true; } var len = dataDetail.length; bool result = index + offsetLength > len; if (result) {} return result; } int checkSum(List data) { int sum = 0; for (int v in data) { sum ^= v; } return sum; } Future> loadAssetsFile(String assetsPath) async { var byteData = await rootBundle.load(assetsPath); return byteData.buffer.asUint8List().toList(); } //获取截取后的数组 List> splitList(List list, int len) { if (len <= 1) { return [list]; } List> result = []; int index = 1; while (true) { if (index * len < list.length) { List temp = list.skip((index - 1) * len).take(len).toList(); result.add(temp); index++; continue; } List temp = list.skip((index - 1) * len).toList(); result.add(temp); break; } return result; } //TODO:int->两个字节 List 高字节在前,低字节在后(小端存储) 本工程只有配置 WiFi用到的!!!! List intToByte2ListLow(int value) => [value >> 8, value]; String radixHex16String(List codeUnits) { String result = ''; for (var value in codeUnits) { result += value.toRadixString(16).padLeft(2, '0'); } return result; } String radixHex16StringTo2String(List codeUnits) { String result = ''; codeUnits.forEach((value) { result += int.parse(value.toRadixString(16).padLeft(2, '0'),radix: 16).toRadixString(2); }); return result; } String asciiString(List codeUnits) { String result = ''; for (var value in codeUnits) { result += String.fromCharCode(value); } return result; } String utf8String(List codeUnits) { codeUnits.reversed; List uniqueList = []; for (int i = 0; i < codeUnits.length; i++) { if (codeUnits[i] != 0) { uniqueList.add(codeUnits[i]); } } uniqueList.reversed; return utf8.decode(uniqueList).toString(); } bool compareTwoList({List? list1, List? list2}) { if (list1!.length != list2!.length) return false; int ctn = list1.length; for (int i = 0; i < ctn; i++) { int v1 = list1[i]; int v2 = list2[i]; if (v1 != v2) { return false; } } return true; } List encodeStringToInt(String input) => utf8.encode(input);