fix:优化序列化逻辑

This commit is contained in:
liyi 2025-01-20 16:21:41 +08:00
parent e2ef3bb2e9
commit 1c73158577

View File

@ -149,122 +149,200 @@ class ScpMessage {
static ScpMessage deserialize(Uint8List bytes) { static ScpMessage deserialize(Uint8List bytes) {
final message = ScpMessage(); final message = ScpMessage();
final length = bytes.length;
int offset = 0; int offset = 0;
// String hexString = //
// bytes.map((b) => b.toRadixString(16).padLeft(2, '0')).join(); if (length < 4 + 1 + 2 + 1 + 1 + 44 + 44 + 2 + 2 + 4) {
// // _log(text: 'result bytes hex: ${hexString}'); throw FormatException("Invalid message length");
// _log( }
// text:
// '\n result bytes hex: ${hexString} \n payload hex: ${hexString.substring(210)}'); // 使 ByteData
final byteData = ByteData.sublistView(bytes);
// ProtocolFlag (4 bytes) // ProtocolFlag (4 bytes)
if (bytes.length - offset >= 4) { message.ProtocolFlag = utf8.decode(bytes.sublist(offset, offset + 4));
message.ProtocolFlag = utf8.decode(bytes.sublist(offset, offset + 4)); offset += 4;
offset += 4;
} else {
throw FormatException("Invalid ProtocolFlag length");
}
// MessageType (1 byte) // MessageType (1 byte)
if (bytes.length - offset >= 1) { message.MessageType = bytes[offset];
message.MessageType = bytes[offset]; offset += 1;
offset += 1;
} else {
throw FormatException("Invalid MessageType length");
}
// MessageId (2 bytes, little-endian) // MessageId (2 bytes, little-endian)
if (bytes.length - offset >= 2) { message.MessageId = byteData.getUint16(offset, Endian.little);
message.MessageId = (bytes[offset + 1] << 8) | bytes[offset]; offset += 2;
offset += 2;
} else {
throw FormatException("Invalid MessageId length");
}
// SpTotal (1 byte) // SpTotal (1 byte)
if (bytes.length - offset >= 1) { message.SpTotal = bytes[offset];
message.SpTotal = bytes[offset]; offset += 1;
offset += 1;
} else {
throw FormatException("Invalid SpTotal length");
}
// SpIndex (1 byte) // SpIndex (1 byte)
if (bytes.length - offset >= 1) { message.SpIndex = bytes[offset];
message.SpIndex = bytes[offset]; offset += 1;
offset += 1;
} else {
throw FormatException("Invalid SpIndex length");
}
// FromPeerId (44) // FromPeerId (44 bytes)
if (bytes.length - offset >= 44) { message.FromPeerId =
message.FromPeerId = utf8.decode(bytes.sublist(offset, offset + 44)).trimRight();
utf8.decode(bytes.sublist(offset, offset + 44)).trimRight(); offset += 44;
offset += 44;
} else {
throw FormatException("Invalid FromPeerId length");
}
// ToPeerId (44) // ToPeerId (44 bytes)
if (bytes.length - offset >= 44) { message.ToPeerId =
message.ToPeerId = utf8.decode(bytes.sublist(offset, offset + 44)).trimRight();
utf8.decode(bytes.sublist(offset, offset + 44)).trimRight(); offset += 44;
offset += 44;
} else {
throw FormatException("Invalid ToPeerId length");
}
// PayloadType (2 bytes, little-endian) // PayloadType (2 bytes, little-endian)
if (bytes.length - offset >= 2) { message.PayloadType = byteData.getUint16(offset, Endian.little);
message.PayloadType = (bytes[offset + 1] << 8) | bytes[offset]; offset += 2;
offset += 2;
} else {
throw FormatException("Invalid PayloadType length");
}
// PayloadCRC (2 bytes, little-endian) // PayloadCRC (2 bytes, little-endian)
if (bytes.length - offset >= 2) { message.PayloadCRC = byteData.getUint16(offset, Endian.little);
message.PayloadCRC = (bytes[offset + 1] << 8) | bytes[offset]; offset += 2;
offset += 2;
} else {
throw FormatException("Invalid PayloadCRC length");
}
// PayloadLength (4 bytes, little-endian) // PayloadLength (4 bytes, little-endian)
if (bytes.length - offset >= 4) { message.PayloadLength = byteData.getUint32(offset, Endian.little);
message.PayloadLength = (bytes[offset] | offset += 4;
(bytes[offset + 1] << 8) |
(bytes[offset + 2] << 16) |
(bytes[offset + 3] << 24)); // little-endian
offset += 4;
} else {
throw FormatException("Invalid PayloadLength length");
}
// Payload // Payload
if (message.PayloadLength != null && if (message.PayloadLength == null ||
bytes.length - offset >= message.PayloadLength!) { length - offset < message.PayloadLength!) {
final sublist = bytes.sublist(offset, offset + message.PayloadLength!);
offset += message.PayloadLength!;
message.Payload = _handlePayLoad(
payloadType: message.PayloadType ?? 0,
messageType: message.MessageType ?? 0,
byte: sublist,
offset: offset,
PayloadLength: message.PayloadLength,
spIndex: message.SpIndex,
spTotal: message.SpTotal,
messageId: message.MessageId,
);
} else {
throw FormatException("Invalid Payload or PayloadLength"); throw FormatException("Invalid Payload or PayloadLength");
} }
// Payload
final payloadBytes = bytes.sublist(offset, offset + message.PayloadLength!);
offset += message.PayloadLength!;
message.Payload = _handlePayLoad(
payloadType: message.PayloadType ?? 0,
messageType: message.MessageType ?? 0,
byte: payloadBytes,
offset: offset,
PayloadLength: message.PayloadLength,
spIndex: message.SpIndex,
spTotal: message.SpTotal,
messageId: message.MessageId,
);
return message; return message;
} }
// static ScpMessage deserialize(Uint8List bytes) {
// final message = ScpMessage();
// int offset = 0;
//
// // String hexString =
// // bytes.map((b) => b.toRadixString(16).padLeft(2, '0')).join();
// // // _log(text: 'result bytes hex: ${hexString}');
// // _log(
// // text:
// // '\n result bytes hex: ${hexString} \n payload hex: ${hexString.substring(210)}');
//
// // ProtocolFlag (4 bytes)
// if (bytes.length - offset >= 4) {
// message.ProtocolFlag = utf8.decode(bytes.sublist(offset, offset + 4));
// offset += 4;
// } else {
// throw FormatException("Invalid ProtocolFlag length");
// }
//
// // MessageType (1 byte)
// if (bytes.length - offset >= 1) {
// message.MessageType = bytes[offset];
// offset += 1;
// } else {
// throw FormatException("Invalid MessageType length");
// }
//
// // MessageId (2 bytes, little-endian)
// if (bytes.length - offset >= 2) {
// message.MessageId = (bytes[offset + 1] << 8) | bytes[offset];
// offset += 2;
// } else {
// throw FormatException("Invalid MessageId length");
// }
//
// // SpTotal (1 byte)
// if (bytes.length - offset >= 1) {
// message.SpTotal = bytes[offset];
// offset += 1;
// } else {
// throw FormatException("Invalid SpTotal length");
// }
//
// // SpIndex (1 byte)
// if (bytes.length - offset >= 1) {
// message.SpIndex = bytes[offset];
// offset += 1;
// } else {
// throw FormatException("Invalid SpIndex length");
// }
//
// // FromPeerId (44)
// if (bytes.length - offset >= 44) {
// message.FromPeerId =
// utf8.decode(bytes.sublist(offset, offset + 44)).trimRight();
// offset += 44;
// } else {
// throw FormatException("Invalid FromPeerId length");
// }
//
// // ToPeerId (44)
// if (bytes.length - offset >= 44) {
// message.ToPeerId =
// utf8.decode(bytes.sublist(offset, offset + 44)).trimRight();
// offset += 44;
// } else {
// throw FormatException("Invalid ToPeerId length");
// }
//
// // PayloadType (2 bytes, little-endian)
// if (bytes.length - offset >= 2) {
// message.PayloadType = (bytes[offset + 1] << 8) | bytes[offset];
// offset += 2;
// } else {
// throw FormatException("Invalid PayloadType length");
// }
//
// // PayloadCRC (2 bytes, little-endian)
// if (bytes.length - offset >= 2) {
// message.PayloadCRC = (bytes[offset + 1] << 8) | bytes[offset];
// offset += 2;
// } else {
// throw FormatException("Invalid PayloadCRC length");
// }
//
// // PayloadLength (4 bytes, little-endian)
// if (bytes.length - offset >= 4) {
// message.PayloadLength = (bytes[offset] |
// (bytes[offset + 1] << 8) |
// (bytes[offset + 2] << 16) |
// (bytes[offset + 3] << 24)); // little-endian
// offset += 4;
// } else {
// throw FormatException("Invalid PayloadLength length");
// }
//
// // Payload
// if (message.PayloadLength != null &&
// bytes.length - offset >= message.PayloadLength!) {
// final sublist = bytes.sublist(offset, offset + message.PayloadLength!);
// offset += message.PayloadLength!;
// message.Payload = _handlePayLoad(
// payloadType: message.PayloadType ?? 0,
// messageType: message.MessageType ?? 0,
// byte: sublist,
// offset: offset,
// PayloadLength: message.PayloadLength,
// spIndex: message.SpIndex,
// spTotal: message.SpTotal,
// messageId: message.MessageId,
// );
// } else {
// throw FormatException("Invalid Payload or PayloadLength");
// }
//
// return message;
// }
// payloadType序列化对应的payload结构体 // payloadType序列化对应的payload结构体
static dynamic _handlePayLoad({ static dynamic _handlePayLoad({
required int payloadType, required int payloadType,