2023-08-09 09:32:09 +08:00

276 lines
7.9 KiB
Dart

import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter/services.dart';
import 'package:encrypt/encrypt.dart';
String getDNSAPIStr(List<int>data, String key, String value) {
final key = Key.fromBase64('BwwfHxgKDwcXAxkWDwEHDBseIREPIA4QDxYOEBIDIRY=');
final iv = IV.fromBase64('FxIOBAcEEhISHgICCRYhEA==');
final encrypter = Encrypter(AES(key, mode: AESMode.cbc, padding: ""));
final encrypted = encrypter.encrypt('hello world', iv: iv);
return encrypted.toString();
}
// static setDNSAPIStr(String value) {
// final key = Key.fromUtf8(RKNetworkManager().mSeeSkyLocalPrivateKey);
// final iv = IV.fromUtf8(RKNetworkManager().mSeeSkyLocalPrivateKey);
// final encrypter = Encrypter(AES(key, mode: AESMode.cbc, padding: "PKCS7"));
// final encrypt = encrypter.encrypt(value, iv: iv);
//
// setCacheString(RKEnum.CACHE_STRING_APISTRURL, encrypt.base16);
// }
//int ---> 指定长度的hex (如指定长度为6的情况,0x000001 0x001234, 0xefab23)
String intToFormatHex(int num, int length) {
String hexString = num.toRadixString(16);
print("hexString=$hexString");
String formatString = hexString.padLeft(length, "0");
print("formatHexString=$formatString");
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<int> 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<int> dataDetail, int index)=>_byteInt16(dataDetail, index);
int _byteInt16(List<int> 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<int> dataDetail, int index)=>_byteInt32(dataDetail, index);
int _byteInt32(List<int> 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<int> intToInt8List(int value) =>[value];
List<int> intToByte2ListHigh(int value) => [value,value >> 8];
//TODO:int->4个字节List 低字节在前,高字节在后(大端存储) 1byte = 8bit
List<int> intToByte4ListHigh(int value) => [value, value >> 8, value >> 16, value >> 24];
int byteUInt8(List<int> 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<int> dataDetail, int index)=>_byteUInt16(dataDetail, index);
_byteUInt16(List<int> 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<int> dataDetail, int index)=>_byteUInt32(dataDetail, index);
int _byteUInt32(List<int> 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<int> dataDetail, int index, int offsetLength){
if(dataDetail == null){
print('❌解析 dataDetail == null');
return true;
}
var len = dataDetail.length;
bool result = index + offsetLength > len;
if(result){
}
return result;
}
int checkSum(List<int> data) {
int sum = 0;
for(int v in data){
sum ^= v;
}
return sum;
}
Future<List<int>> loadAssetsFile(String assetsPath) async{
var byteData = await rootBundle.load(assetsPath);
return byteData.buffer.asUint8List().toList();
}
//TODO:获取数据包分包后包的数量
int getPackageCount(List<int> data,{required int averageLen}){
int len = data.length;
return len%averageLen > 0 ? (len~/averageLen + 1) : len~/averageLen;
}
List<int> getSubData({
required int index,
required int average,
required List<int> data
}){
if(data.isEmpty){
return [];
}
int totalLength = data.length;
if(average >= totalLength){
return data;
}
if(index*average > totalLength){
if((index - 1)*average > totalLength){
return [];
}else{
int tempCount = average*(index - 1);
return data.sublist(tempCount,totalLength);
}
}else{
return data.sublist(average*(index - 1),average*index);
}
}
List<int> reverseList(List<int> srcData){
print('srcData:$srcData'); //[1,3]
int srcLen = srcData.length;
int halfLen = srcLen ~/2;
List<int> dstData = [];
dstData.addAll(srcData);
for(int i =0; i < halfLen; i++){
int begin = i;
int end = srcLen-i-1;
List<int> beginData = srcData.sublist(begin,begin+1);
List<int> endData = srcData.sublist(end,end + 1);
dstData.replaceRange(begin, begin+1, endData);
dstData.replaceRange(end, end+1, beginData);
}
print('dstData:$dstData');
return dstData;
}
//TODO:int->两个字节 List 高字节在前,低字节在后(小端存储) 本工程只有配置 WiFi用到的!!!!
List<int> intToByte2ListLow(int value) =>[value >> 8,value];
int dealWeekDays({
required int mon,
required int tue,
required int wed,
required int thu,
required int fri,
required int sat,
required int sun,
}){
return mon + tue * 2 + wed * 4 + thu * 8 + fri * 16 + sat * 32 + sun * 64;
}
String radixString(List<int> codeUnits){
String result = '';
codeUnits.forEach((value){
result += value.toRadixString(16).padLeft(2,'0');
});
return result;
}
String asciiString(List<int> codeUnits){
String result = '';
codeUnits.forEach((value){
result += String.fromCharCode(value);
});
return result;
}
String utf8String(List<int> codeUnits){
return utf8.decode(codeUnits);
}
bool compareTwoList({List<int>? list1,List<int>? 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){
print('不包含 $i');
return false;
}
}
return true;
}
List<int> encodeStringToInt(String input)=>utf8.encode(input);