import java.nio.charset.StandardCharsets;
public class Main {
public static void main
(String[] args
) { int cmdId = 0xF105; // cmdID
for (String str
: strValues
) { StringBuilder stringBuilder = new StringBuilder();
byte[] bytes = constructReplyPkt(cmdId, str);
for (byte b : bytes) {
if (s.length() < 3) {
s = "0" + s;
}
stringBuilder.append(s);
}
System.
out.
println("Packet for str=\"" + str
+ "\": " + stringBuilder
); }
}
protected static byte[] constructReplyPkt
(int nCmdId,
String sDataContent
) { if (sDataContent == null) {
sDataContent = "";
}
byte[] baDataContent = sDataContent.getBytes(StandardCharsets.US_ASCII);
return constructReplyPkt(nCmdId, baDataContent);
}
protected static byte[] constructReplyPkt(int nCmdId, byte[] baDataContent) {
return constructReplyPkt(nCmdId, baDataContent, 1, 1);
}
public static final byte PKT_HEAD_BYTE = (byte) 0x27;
public static final byte PKT_DIR_PCtoTV = (byte) 0x01;
public static final byte PKT_TAIL_BYTE = (byte) 0xFB;
protected static byte[] constructReplyPkt(int nCmdId, byte[] baDataContent, int nFrameNo, int nTotalFrameCnt) {
int nbaDataContentLen = (baDataContent != null) ? baDataContent.length : 0;
int nPktTotalLen = 9 + nbaDataContentLen;
if (nPktTotalLen > 255) {
return null; // 若封包長度超過255則返回null
}
byte[] onePkt = new byte[nPktTotalLen];
onePkt[0] = PKT_HEAD_BYTE;
onePkt[1] = PKT_DIR_PCtoTV;
onePkt[2] = (byte) ((nCmdId & 0xFF00) >> 8);
onePkt[3] = (byte) (nCmdId & 0x00FF);
onePkt[4] = (byte) nbaDataContentLen;
if (baDataContent != null) {
System.
arraycopy(baDataContent,
0, onePkt,
5, nbaDataContentLen
); }
onePkt[5 + nbaDataContentLen] = (byte) nFrameNo;
onePkt[6 + nbaDataContentLen] = (byte) nTotalFrameCnt;
byte nChksum = 0;
for (int nByteId = 1; nByteId < onePkt.length - 2; nByteId++) {
nChksum ^= onePkt[nByteId];
}
onePkt[7 + nbaDataContentLen] = nChksum;
onePkt[8 + nbaDataContentLen] = PKT_TAIL_BYTE;
return onePkt;
}
}
aW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKCnB1YmxpYyBjbGFzcyBNYWluIHsKCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgaW50IGNtZElkID0gMHhGMTA1OyAvLyBjbWRJRAogICAgICAgIFN0cmluZ1tdIHN0clZhbHVlcyA9IHsgIiJ9OwoKICAgICAgICBmb3IgKFN0cmluZyBzdHIgOiBzdHJWYWx1ZXMpIHsKICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gY29uc3RydWN0UmVwbHlQa3QoY21kSWQsIHN0cik7CgogICAgICAgICAgICBmb3IgKGJ5dGUgYiA6IGJ5dGVzKSB7CiAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IEludGVnZXIudG9IZXhTdHJpbmcoYiAmIDB4RkYpICsgIiAiOwogICAgICAgICAgICAgICAgaWYgKHMubGVuZ3RoKCkgPCAzKSB7CiAgICAgICAgICAgICAgICAgICAgcyA9ICIwIiArIHM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZChzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQYWNrZXQgZm9yIHN0cj1cIiIgKyBzdHIgKyAiXCI6ICIgKyBzdHJpbmdCdWlsZGVyKTsKICAgICAgICB9CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyBieXRlW10gY29uc3RydWN0UmVwbHlQa3QoaW50IG5DbWRJZCwgU3RyaW5nIHNEYXRhQ29udGVudCkgewogICAgICAgIGlmIChzRGF0YUNvbnRlbnQgPT0gbnVsbCkgewogICAgICAgICAgICBzRGF0YUNvbnRlbnQgPSAiIjsKICAgICAgICB9CiAgICAgICAgYnl0ZVtdIGJhRGF0YUNvbnRlbnQgPSBzRGF0YUNvbnRlbnQuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VU19BU0NJSSk7CiAgICAgICAgcmV0dXJuIGNvbnN0cnVjdFJlcGx5UGt0KG5DbWRJZCwgYmFEYXRhQ29udGVudCk7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyBieXRlW10gY29uc3RydWN0UmVwbHlQa3QoaW50IG5DbWRJZCwgYnl0ZVtdIGJhRGF0YUNvbnRlbnQpIHsKICAgICAgICByZXR1cm4gY29uc3RydWN0UmVwbHlQa3QobkNtZElkLCBiYURhdGFDb250ZW50LCAxLCAxKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgUEtUX0hFQURfQllURSA9IChieXRlKSAweDI3OwogICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFBLVF9ESVJfUEN0b1RWID0gKGJ5dGUpIDB4MDE7CiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgUEtUX1RBSUxfQllURSA9IChieXRlKSAweEZCOwoKICAgIHByb3RlY3RlZCBzdGF0aWMgYnl0ZVtdIGNvbnN0cnVjdFJlcGx5UGt0KGludCBuQ21kSWQsIGJ5dGVbXSBiYURhdGFDb250ZW50LCBpbnQgbkZyYW1lTm8sIGludCBuVG90YWxGcmFtZUNudCkgewogICAgICAgIGludCBuYmFEYXRhQ29udGVudExlbiA9IChiYURhdGFDb250ZW50ICE9IG51bGwpID8gYmFEYXRhQ29udGVudC5sZW5ndGggOiAwOwogICAgICAgIGludCBuUGt0VG90YWxMZW4gPSA5ICsgbmJhRGF0YUNvbnRlbnRMZW47CgogICAgICAgIGlmIChuUGt0VG90YWxMZW4gPiAyNTUpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIOiLpeWwgeWMhemVt+W6pui2hemBjjI1NeWJh+i/lOWbnm51bGwKICAgICAgICB9CgogICAgICAgIGJ5dGVbXSBvbmVQa3QgPSBuZXcgYnl0ZVtuUGt0VG90YWxMZW5dOwogICAgICAgIG9uZVBrdFswXSA9IFBLVF9IRUFEX0JZVEU7CiAgICAgICAgb25lUGt0WzFdID0gUEtUX0RJUl9QQ3RvVFY7CiAgICAgICAgb25lUGt0WzJdID0gKGJ5dGUpICgobkNtZElkICYgMHhGRjAwKSA+PiA4KTsKICAgICAgICBvbmVQa3RbM10gPSAoYnl0ZSkgKG5DbWRJZCAmIDB4MDBGRik7CiAgICAgICAgb25lUGt0WzRdID0gKGJ5dGUpIG5iYURhdGFDb250ZW50TGVuOwoKICAgICAgICBpZiAoYmFEYXRhQ29udGVudCAhPSBudWxsKSB7CiAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYmFEYXRhQ29udGVudCwgMCwgb25lUGt0LCA1LCBuYmFEYXRhQ29udGVudExlbik7CiAgICAgICAgfQoKICAgICAgICBvbmVQa3RbNSArIG5iYURhdGFDb250ZW50TGVuXSA9IChieXRlKSBuRnJhbWVObzsKICAgICAgICBvbmVQa3RbNiArIG5iYURhdGFDb250ZW50TGVuXSA9IChieXRlKSBuVG90YWxGcmFtZUNudDsKCiAgICAgICAgYnl0ZSBuQ2hrc3VtID0gMDsKICAgICAgICBmb3IgKGludCBuQnl0ZUlkID0gMTsgbkJ5dGVJZCA8IG9uZVBrdC5sZW5ndGggLSAyOyBuQnl0ZUlkKyspIHsKICAgICAgICAgICAgbkNoa3N1bSBePSBvbmVQa3RbbkJ5dGVJZF07CiAgICAgICAgfQoKICAgICAgICBvbmVQa3RbNyArIG5iYURhdGFDb250ZW50TGVuXSA9IG5DaGtzdW07CiAgICAgICAgb25lUGt0WzggKyBuYmFEYXRhQ29udGVudExlbl0gPSBQS1RfVEFJTF9CWVRFOwoKICAgICAgICByZXR1cm4gb25lUGt0OwogICAgfQp9Cg==