816 lines
22 KiB
Dart
Executable File
816 lines
22 KiB
Dart
Executable File
import 'dart:convert';
|
||
|
||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||
import 'package:star_lock/app_settings/app_settings.dart';
|
||
import 'package:star_lock/blue/blue_manage.dart';
|
||
import 'package:star_lock/blue/io_gateway/io_gateway_configuringWifi.dart';
|
||
import 'package:star_lock/blue/io_gateway/io_gateway_getWifiList.dart';
|
||
import 'package:star_lock/blue/io_protocol/io_addFace.dart';
|
||
import 'package:star_lock/blue/io_protocol/io_addPalmWithTimeCycleCoercion.dart';
|
||
import 'package:star_lock/blue/io_protocol/io_changeAdministratorPassword.dart';
|
||
import 'package:star_lock/blue/io_protocol/io_cleanUpUsers.dart';
|
||
import 'package:star_lock/blue/io_protocol/io_deletUser.dart';
|
||
import 'package:star_lock/blue/io_protocol/io_editUser.dart';
|
||
import 'package:star_lock/blue/io_protocol/io_factoryDataReset.dart';
|
||
import 'package:star_lock/blue/io_protocol/io_getDeviceModel.dart';
|
||
import 'package:star_lock/blue/io_protocol/io_otaUpgrade.dart';
|
||
import 'package:star_lock/blue/io_protocol/io_processOtaUpgrade.dart';
|
||
import 'package:star_lock/blue/io_protocol/io_readAdminPassword.dart';
|
||
import 'package:star_lock/blue/io_protocol/io_readSupportFunctionsNoParameters.dart';
|
||
import 'package:star_lock/blue/io_protocol/io_readSupportFunctionsWithParameters.dart';
|
||
import 'package:star_lock/blue/io_protocol/io_readVoicePackageFinalResult.dart';
|
||
import 'package:star_lock/blue/io_protocol/io_referEventRecordTime.dart';
|
||
import 'package:star_lock/blue/io_protocol/io_setSupportFunctionsNoParameters.dart';
|
||
import 'package:star_lock/blue/io_protocol/io_setSupportFunctionsWithParameters.dart';
|
||
import 'package:star_lock/blue/io_protocol/io_setVoicePackageFinalResult.dart';
|
||
import 'package:star_lock/blue/io_protocol/io_timing.dart';
|
||
import 'package:star_lock/blue/io_protocol/io_voicePackageConfigure.dart';
|
||
import 'package:star_lock/blue/io_protocol/io_voicePackageConfigureProcess.dart';
|
||
|
||
import '../tools/storage.dart';
|
||
import 'io_gateway/io_gateway_getStatus.dart';
|
||
import 'io_protocol/io_addFingerprintWithTimeCycleCoercion.dart';
|
||
import 'io_protocol/io_addICCardWithTimeCycleCoercion.dart';
|
||
import 'io_protocol/io_addRemoteControlWithTimeCycleCoercion.dart';
|
||
import 'io_protocol/io_addUser.dart';
|
||
import 'io_protocol/io_configuringWifi.dart';
|
||
import 'io_protocol/io_getPrivateKey.dart';
|
||
import 'io_protocol/io_getPublicKey.dart';
|
||
import 'io_protocol/io_getStarLockStatusInfo.dart';
|
||
import 'io_protocol/io_getWifiList.dart';
|
||
import 'io_protocol/io_openLock.dart';
|
||
import 'io_protocol/io_senderCustomPasswords.dart';
|
||
import 'io_protocol/io_senderResetPasswords.dart';
|
||
import 'io_protocol/io_transferSmartLock.dart';
|
||
import 'io_protocol/io_updataLockCardList.dart';
|
||
import 'io_protocol/io_updataLockFaceList.dart';
|
||
import 'io_protocol/io_updataLockFingerprintList.dart';
|
||
import 'io_protocol/io_updataLockPalmVeinList.dart';
|
||
import 'io_protocol/io_updataLockPasswordList.dart';
|
||
import 'io_protocol/io_updataLockRemoteControlList.dart';
|
||
import 'io_protocol/io_updataLockSet.dart';
|
||
import 'io_reply.dart';
|
||
import 'io_tool/io_manager.dart';
|
||
import 'io_tool/io_tool.dart';
|
||
import 'io_tool/manager_event_bus.dart';
|
||
import 'io_type.dart';
|
||
import 'sm4Encipher/sm4.dart';
|
||
|
||
class CommandReciverManager {
|
||
static Future<void> appDataReceive(List<int> data) async {
|
||
///解析数据
|
||
if (data.isEmpty) {
|
||
return;
|
||
}
|
||
|
||
final int dataSize = data.length;
|
||
|
||
// 验证CRC校验
|
||
// if (dataSize >= 2) {
|
||
// final int calculatedCrc =
|
||
// _calculateCRC16(data.sublist(0, dataSize - 2), dataSize - 2);
|
||
// final int receivedCrc = (data[dataSize - 2] << 8) | data[dataSize - 1];
|
||
//
|
||
// if (calculatedCrc != receivedCrc) {
|
||
// throw Exception('CRC校验失败');
|
||
// return;
|
||
// }
|
||
// }
|
||
// 当小于包头加起来13个字节
|
||
if (dataSize < 13) {
|
||
return;
|
||
}
|
||
|
||
if ((data[0] == 0xEF) &&
|
||
(data[1] == 0x01) &&
|
||
(data[2] == 0xEE) &&
|
||
(data[3] == 0x02)) {
|
||
final int tmpType = data[7] & 0x0f; // 包标识
|
||
// AppLog.log('temType:$tmpType');
|
||
|
||
final int dataLen = data[8] * 256 + data[9]; // 高16位用来指示后面数据块内容的长度
|
||
final int oriLen = data[10] * 256 + data[11]; // 低16位用来指示数据加密前的原长度
|
||
// AppLog.log("dataLen:$dataLen oriLen:$oriLen");
|
||
List<int> oriDataList = <int>[];
|
||
switch (tmpType) {
|
||
case 0: //不加密
|
||
// for (var i = 0; i < oriLen ; i++) {
|
||
// oriDataList.add(data[12 + i]);
|
||
// }
|
||
oriDataList = data.sublist(12, 12 + dataLen);
|
||
AppLog.log('不加密 :$oriDataList');
|
||
break;
|
||
case 1:
|
||
//AES128
|
||
break;
|
||
case 2:
|
||
// SM4(事先约定密钥)
|
||
// 获取的加密数组
|
||
final List<int> getDataList = data.sublist(12, 12 + dataLen);
|
||
|
||
// 解密
|
||
// String key = SM4.createHexKey(key: IoManager().getCurrentDeviceLockId);
|
||
oriDataList = SM4.decrypt(getDataList,
|
||
key: utf8.encode(BlueManage().connectDeviceName),
|
||
mode: SM4CryptoMode.ECB);
|
||
oriDataList = oriDataList.sublist(0, oriLen);
|
||
AppLog.log('APP收到的解密后的数据:$oriDataList');
|
||
break;
|
||
case 3:
|
||
//SM4(设备指定密钥)
|
||
// 获取的加密数组
|
||
final List<int> getDataList = data.sublist(12, 12 + dataLen);
|
||
|
||
final List<String>? res =
|
||
await Storage.getStringList(saveBluePrivateKey);
|
||
final List<int> getPrivateKeyList = changeStringListToIntList(res!);
|
||
|
||
// 解密
|
||
oriDataList = SM4.decrypt(getDataList,
|
||
key: getPrivateKeyList, mode: SM4CryptoMode.ECB);
|
||
oriDataList = oriDataList.sublist(0, oriLen);
|
||
AppLog.log('APP收到的解密后的数据:$oriDataList data:$data');
|
||
break;
|
||
}
|
||
parseData(oriDataList).then((Reply? value) async {
|
||
// EasyLoading.dismiss();
|
||
await EventBusManager().eventBusFir(value);
|
||
}).catchError((Object error) {
|
||
AppLog.log('APP解析数据时发生错误: ${error.toString()}');
|
||
});
|
||
}
|
||
}
|
||
|
||
// CRC16 校验计算
|
||
static int _calculateCRC16(List<int> bytes, int len) {
|
||
int value = 0x0000;
|
||
for (int i = 0; i < len; i++) {
|
||
int tmp = _reverse8(bytes[i]);
|
||
value = ((value << 8) ^ _crcTable[(value >> 8) ^ tmp & 0xFF]) & 0xFFFF;
|
||
}
|
||
return _reverse16(value);
|
||
}
|
||
|
||
static Future<Reply?> parseData(List<int> data) async {
|
||
if (data.isNotEmpty) {
|
||
final int cmd = data[0] * 256 + data[1];
|
||
final CommandType commandType = ExtensionCommandType.getCommandType(cmd);
|
||
await IoManager().increaseCommandIndex();
|
||
// data.removeRange(0, 2);
|
||
Reply? reply;
|
||
switch (commandType) {
|
||
case CommandType.getLockPublicKey:
|
||
{
|
||
reply = GetPublicKeyReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.getLockPrivateKey:
|
||
{
|
||
reply = GetPrivateKeyReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.addUser:
|
||
{
|
||
reply = AddUserReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.deletUser:
|
||
{
|
||
reply = DeletUserReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.openLock:
|
||
{
|
||
reply = OpenDoorReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
// 弃用
|
||
// case CommandType.readLockStatusInfo:
|
||
// {
|
||
// reply = GetLockStatuReply.parseData(commandType, data);
|
||
// }
|
||
// break;
|
||
case CommandType.editUser:
|
||
{
|
||
reply = EditUserReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.transferSmartLock:
|
||
{
|
||
reply = TransferSmartLockReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.factoryDataReset:
|
||
{
|
||
reply = FactoryDataResetReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.calibrationTime:
|
||
{
|
||
reply = TimingReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.readStarLockStatusInfo:
|
||
{
|
||
reply = GetStarLockStatuInfoReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.startOATUpgrade:
|
||
{
|
||
reply = OTAUpgradeReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.confirmationOTAUpgrade:
|
||
{
|
||
reply = ConfirmationOTAUpgradeReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.processOTAUpgrade:
|
||
{
|
||
reply = ProcessOtaUpgradeReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.cleanUpUsers:
|
||
{
|
||
reply = CleanUpUsersReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.updataLockPasswordList:
|
||
{
|
||
reply = UpdataLockPasswordListReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.updataLockCardList:
|
||
{
|
||
reply = UpdataLockCardListReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.updataLockFingerprintList:
|
||
{
|
||
reply = UpdataLockFingerprintListReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.updataLockFaceList:
|
||
{
|
||
reply = UpdataLockFaceListReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.updataLockPalmVeinList:
|
||
{
|
||
reply = UpdataLockPalmVeinListReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.updataLockRemoteControlList:
|
||
{
|
||
reply =
|
||
UpdataLockRemoteControlListReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.updataLockSet:
|
||
{
|
||
reply = UpdataLockSetReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.gatewayConfiguringWifi:
|
||
{
|
||
reply = GatewayConfiguringWifiReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.gatewayConfiguringWifiResult:
|
||
{
|
||
reply =
|
||
GatewayConfiguringWifiResultReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.gatewayGetWifiList:
|
||
{
|
||
reply = GatewayGetWifiReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.gatewayGetWifiListResult:
|
||
{
|
||
reply = GatewayGetWifiListReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.gatewayGetStatus:
|
||
{
|
||
reply = GatewayGetStatusReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.getDeviceModel:
|
||
{
|
||
reply = GetDeviceModelReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.startVoicePackageConfigure:
|
||
{
|
||
reply = VoicePackageConfigureReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.voicePackageConfigureProcess:
|
||
{
|
||
reply =
|
||
VoicePackageConfigureProcessReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.voicePackageConfigureConfirmation:
|
||
{
|
||
reply = VoicePackageConfigureConfirmationReply.parseData(
|
||
commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.readLockCurrentVoicePacket:
|
||
{
|
||
reply =
|
||
ReadLockCurrentVoicePacketReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.setLockCurrentVoicePacket:
|
||
{
|
||
reply =
|
||
SetVoicePackageFinalResultReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case CommandType.generalExtendedCommond:
|
||
{
|
||
// 子命令类型
|
||
final int subType = data[3];
|
||
switch (subType) {
|
||
case 2:
|
||
{
|
||
// 修改管理员密码
|
||
reply = ChangeAdministratorPasswordReply.parseData(
|
||
commandType, data);
|
||
}
|
||
break;
|
||
case 3:
|
||
{
|
||
// 设置开锁密码
|
||
reply =
|
||
SenderCustomPasswordsReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
// case 4:
|
||
// {
|
||
// // 自动落锁开关
|
||
// reply = AutomaticPadlockReply.parseData(commandType, data);
|
||
// }
|
||
// break;
|
||
case 19:
|
||
{
|
||
// 重置开锁密码
|
||
reply =
|
||
SenderResetPasswordsReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
// case 21:
|
||
// {
|
||
// // 注册卡片开始
|
||
// reply = SenderAddICCardReply.parseData(commandType, data);
|
||
// }
|
||
// break;
|
||
case 22:
|
||
{
|
||
// 注册卡片确认
|
||
reply = SenderAddICCardConfirmationReply.parseData(
|
||
commandType, data);
|
||
}
|
||
break;
|
||
case 24:
|
||
{
|
||
// 注册卡片开始
|
||
reply = SenderAddICCardWithTimeCycleCoercionReply.parseData(
|
||
commandType, data);
|
||
}
|
||
break;
|
||
case 26:
|
||
{
|
||
// 注册遥控开始
|
||
reply = SenderAddRemoteControlWithTimeCycleCoercionReply
|
||
.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case 27:
|
||
{
|
||
// 注册遥控确认
|
||
reply = SenderAddRemoteControlConfirmationReply.parseData(
|
||
commandType, data);
|
||
}
|
||
break;
|
||
case 32:
|
||
{
|
||
// 注册指纹确认
|
||
reply = SenderAddFingerprintConfirmationReply.parseData(
|
||
commandType, data);
|
||
}
|
||
break;
|
||
case 33:
|
||
{
|
||
// 注册指纹过程
|
||
reply = SenderAddFingerprintProcessReply.parseData(
|
||
commandType, data);
|
||
}
|
||
break;
|
||
case 36:
|
||
{
|
||
// 注册指纹开始(带限时、循环、胁迫...)
|
||
reply =
|
||
SenderAddFingerprintWithTimeCycleCoercionReply.parseData(
|
||
commandType, data);
|
||
}
|
||
break;
|
||
case 41:
|
||
{
|
||
// 时间条件查询事件记录
|
||
reply = SenderReferEventRecordTimeReply.parseData(
|
||
commandType, data);
|
||
}
|
||
break;
|
||
case 42:
|
||
{
|
||
// 注册掌静脉开始
|
||
reply = SenderAddPalmWithTimeCycleCoercionReply.parseData(
|
||
commandType, data);
|
||
}
|
||
break;
|
||
case 43:
|
||
{
|
||
// 注册掌静脉确认
|
||
reply = SenderAddPalmConfirmationReply.parseData(
|
||
commandType, data);
|
||
}
|
||
break;
|
||
// case 50:
|
||
// {
|
||
// // wifi配网
|
||
// reply = SenderConfiguringWifiReply.parseData(commandType, data);
|
||
// }
|
||
// break;
|
||
case 51:
|
||
{
|
||
// wifi配网结果
|
||
reply =
|
||
SenderConfiguringWifiReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case 53:
|
||
{
|
||
// 获取wifilist
|
||
reply = SenderGetWifiReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case 54:
|
||
{
|
||
// 门锁搜索2.4G WIFI SSID 结果
|
||
reply = SenderGetWifiListReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case 70:
|
||
{
|
||
// 设置支持功能(不带参数)启用/禁用
|
||
reply = SetSupportFunctionsNoParametersReply.parseData(
|
||
commandType, data);
|
||
}
|
||
break;
|
||
case 71:
|
||
{
|
||
// 读取支持功能(不带参数)启用/禁用状态
|
||
reply = ReadSupportFunctionsNoParametersReply.parseData(
|
||
commandType, data);
|
||
}
|
||
break;
|
||
case 72:
|
||
{
|
||
// 设置支持功能(带参数)
|
||
reply = SetSupportFunctionsWithParametersReply.parseData(
|
||
commandType, data);
|
||
}
|
||
break;
|
||
case 73:
|
||
{
|
||
// 读取支持功能(带参数)参数
|
||
reply = ReadSupportFunctionsWithParametersReply.parseData(
|
||
commandType, data);
|
||
}
|
||
break;
|
||
case 74:
|
||
{
|
||
// 读取管理员密码
|
||
reply =
|
||
SenderReadAdminPasswordReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case 81:
|
||
{
|
||
// 注册人脸开始
|
||
reply = SenderAddFaceReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
case 82:
|
||
{
|
||
// 注册人脸确认
|
||
reply = SenderAddFaceConfirmationReply.parseData(
|
||
commandType, data);
|
||
}
|
||
break;
|
||
|
||
case 83:
|
||
{
|
||
// 注册人脸过程
|
||
reply =
|
||
SenderAddFaceProcessReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
break;
|
||
default:
|
||
{
|
||
reply = GetStarLockStatuInfoReply.parseData(commandType, data);
|
||
}
|
||
break;
|
||
}
|
||
return reply;
|
||
}
|
||
return null;
|
||
}
|
||
|
||
// CRC16 查找表
|
||
static const List<int> _crcTable = [
|
||
0x0000,
|
||
0x1021,
|
||
0x2042,
|
||
0x3063,
|
||
0x4084,
|
||
0x50a5,
|
||
0x60c6,
|
||
0x70e7,
|
||
0x8108,
|
||
0x9129,
|
||
0xa14a,
|
||
0xb16b,
|
||
0xc18c,
|
||
0xd1ad,
|
||
0xe1ce,
|
||
0xf1ef,
|
||
0x1231,
|
||
0x0210,
|
||
0x3273,
|
||
0x2252,
|
||
0x52b5,
|
||
0x4294,
|
||
0x72f7,
|
||
0x62d6,
|
||
0x9339,
|
||
0x8318,
|
||
0xb37b,
|
||
0xa35a,
|
||
0xd3bd,
|
||
0xc39c,
|
||
0xf3ff,
|
||
0xe3de,
|
||
0x2462,
|
||
0x3443,
|
||
0x0420,
|
||
0x1401,
|
||
0x64e6,
|
||
0x74c7,
|
||
0x44a4,
|
||
0x5485,
|
||
0xa56a,
|
||
0xb54b,
|
||
0x8528,
|
||
0x9509,
|
||
0xe5ee,
|
||
0xf5cf,
|
||
0xc5ac,
|
||
0xd58d,
|
||
0x3653,
|
||
0x2672,
|
||
0x1611,
|
||
0x0630,
|
||
0x76d7,
|
||
0x66f6,
|
||
0x5695,
|
||
0x46b4,
|
||
0xb75b,
|
||
0xa77a,
|
||
0x9719,
|
||
0x8738,
|
||
0xf7df,
|
||
0xe7fe,
|
||
0xd79d,
|
||
0xc7bc,
|
||
0x48c4,
|
||
0x58e5,
|
||
0x6886,
|
||
0x78a7,
|
||
0x0840,
|
||
0x1861,
|
||
0x2802,
|
||
0x3823,
|
||
0xc9cc,
|
||
0xd9ed,
|
||
0xe98e,
|
||
0xf9af,
|
||
0x8948,
|
||
0x9969,
|
||
0xa90a,
|
||
0xb92b,
|
||
0x5af5,
|
||
0x4ad4,
|
||
0x7ab7,
|
||
0x6a96,
|
||
0x1a71,
|
||
0x0a50,
|
||
0x3a33,
|
||
0x2a12,
|
||
0xdbfd,
|
||
0xcbdc,
|
||
0xfbbf,
|
||
0xeb9e,
|
||
0x9b79,
|
||
0x8b58,
|
||
0xbb3b,
|
||
0xab1a,
|
||
0x6ca6,
|
||
0x7c87,
|
||
0x4ce4,
|
||
0x5cc5,
|
||
0x2c22,
|
||
0x3c03,
|
||
0x0c60,
|
||
0x1c41,
|
||
0xedae,
|
||
0xfd8f,
|
||
0xcdec,
|
||
0xddcd,
|
||
0xad2a,
|
||
0xbd0b,
|
||
0x8d68,
|
||
0x9d49,
|
||
0x7e97,
|
||
0x6eb6,
|
||
0x5ed5,
|
||
0x4ef4,
|
||
0x3e13,
|
||
0x2e32,
|
||
0x1e51,
|
||
0x0e70,
|
||
0xff9f,
|
||
0xefbe,
|
||
0xdfdd,
|
||
0xcffc,
|
||
0xbf1b,
|
||
0xaf3a,
|
||
0x9f59,
|
||
0x8f78,
|
||
0x9188,
|
||
0x81a9,
|
||
0xb1ca,
|
||
0xa1eb,
|
||
0xd10c,
|
||
0xc12d,
|
||
0xf14e,
|
||
0xe16f,
|
||
0x1080,
|
||
0x00a1,
|
||
0x30c2,
|
||
0x20e3,
|
||
0x5004,
|
||
0x4025,
|
||
0x7046,
|
||
0x6067,
|
||
0x83b9,
|
||
0x9398,
|
||
0xa3fb,
|
||
0xb3da,
|
||
0xc33d,
|
||
0xd31c,
|
||
0xe37f,
|
||
0xf35e,
|
||
0x02b1,
|
||
0x1290,
|
||
0x22f3,
|
||
0x32d2,
|
||
0x4235,
|
||
0x5214,
|
||
0x6277,
|
||
0x7256,
|
||
0xb5ea,
|
||
0xa5cb,
|
||
0x95a8,
|
||
0x8589,
|
||
0xf56e,
|
||
0xe54f,
|
||
0xd52c,
|
||
0xc50d,
|
||
0x34e2,
|
||
0x24c3,
|
||
0x14a0,
|
||
0x0481,
|
||
0x7466,
|
||
0x6447,
|
||
0x5424,
|
||
0x4405,
|
||
0xa7db,
|
||
0xb7fa,
|
||
0x8799,
|
||
0x97b8,
|
||
0xe75f,
|
||
0xf77e,
|
||
0xc71d,
|
||
0xd73c,
|
||
0x26d3,
|
||
0x36f2,
|
||
0x0691,
|
||
0x16b0,
|
||
0x6657,
|
||
0x7676,
|
||
0x4615,
|
||
0x5634,
|
||
0xd94c,
|
||
0xc96d,
|
||
0xf90e,
|
||
0xe92f,
|
||
0x99c8,
|
||
0x89e9,
|
||
0xb98a,
|
||
0xa9ab,
|
||
0x5844,
|
||
0x4865,
|
||
0x7806,
|
||
0x6827,
|
||
0x18c0,
|
||
0x08e1,
|
||
0x3882,
|
||
0x28a3,
|
||
0xcb7d,
|
||
0xdb5c,
|
||
0xeb3f,
|
||
0xfb1e,
|
||
0x8bf9,
|
||
0x9bd8,
|
||
0xabbb,
|
||
0xbb9a,
|
||
0x4a75,
|
||
0x5a54,
|
||
0x6a37,
|
||
0x7a16,
|
||
0x0af1,
|
||
0x1ad0,
|
||
0x2ab3,
|
||
0x3a92,
|
||
0xfd2e,
|
||
0xed0f,
|
||
0xdd6c,
|
||
0xcd4d,
|
||
0xbdaa,
|
||
0xad8b,
|
||
0x9de8,
|
||
0x8dc9,
|
||
0x7c26,
|
||
0x6c07,
|
||
0x5c64,
|
||
0x4c45,
|
||
0x3ca2,
|
||
0x2c83,
|
||
0x1ce0,
|
||
0x0cc1,
|
||
0xef1f,
|
||
0xff3e,
|
||
0xcf5d,
|
||
0xdf7c,
|
||
0xaf9b,
|
||
0xbfba,
|
||
0x8fd9,
|
||
0x9ff8,
|
||
0x6e17,
|
||
0x7e36,
|
||
0x4e55,
|
||
0x5e74,
|
||
0x2e93,
|
||
0x3eb2,
|
||
0x0ed1,
|
||
0x1ef0
|
||
];
|
||
|
||
// 8位字节反转
|
||
static int _reverse8(int data) {
|
||
int temp = 0;
|
||
for (int i = 0; i < 8; i++) {
|
||
temp |= ((data >> i) & 0x01) << (7 - i);
|
||
}
|
||
return temp;
|
||
}
|
||
|
||
// 16位字反转
|
||
static int _reverse16(int data) {
|
||
int temp = 0;
|
||
for (int i = 0; i < 16; i++) {
|
||
temp |= ((data >> i) & 0x0001) << (15 - i);
|
||
}
|
||
return temp;
|
||
}
|
||
}
|