import java.io.*;
import java.net.*;
import java.util.Arrays;
public class EnhancedHexClient {
private static final byte START_MARKER = (byte) 0xAA;
private static final byte END_MARKER = (byte) 0xAA;
private static class HexConverter {
private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
public static byte[] hexToBytes(String hex) {
hex = hex.replaceAll("\\s", "").toUpperCase();
if (hex.length() % 2 != 0) {
throw new IllegalArgumentException("Invalid hex string");
}
byte[] bytes = new byte[hex.length() / 2];
for (int i = 0; i < bytes.length; i++) {
int high = Character.digit(hex.charAt(i*2), 16) << 4;
int low = Character.digit(hex.charAt(i*2+1), 16);
bytes[i] = (byte) (high + low);
}
return bytes;
}
public static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
for (int j = 0; j < bytes.length; j++) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = HEX_ARRAY[v >>> 4];
hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
}
return new String(hexChars);
}
}
private static byte calculateChecksum(byte[] data) {
byte checksum = 0;
for (byte b : data) {
checksum ^= b;
}
return checksum;
}
public static void main(String[] args) {
String serverAddress = "8.130.77.20";
int serverPort = 8080;
String dataContent = "0104087781800500000005591D1002";
try (Socket socket = new Socket(serverAddress, serverPort);
OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream()) {
byte[] dataBytes = HexConverter.hexToBytes(dataContent);
int dataLength = dataBytes.length;
byte[] lengthBytes = new byte[] {
(byte) ((dataLength >> 8) & 0xFF),
(byte) (dataLength & 0xFF)
};
byte checksum = calculateChecksum(dataBytes);
ByteArrayOutputStream packet = new ByteArrayOutputStream();
packet.write(START_MARKER);
packet.write(lengthBytes);
packet.write(dataBytes);
packet.write(checksum);
packet.write(END_MARKER);
byte[] fullPacket = packet.toByteArray();
out.write(fullPacket);
out.flush();
System.out.println("Sent full packet: " + HexConverter.bytesToHex(fullPacket));