package publicway;
|
|
public class QueryData {
|
// 常量定义
|
private static final String HEADER = "DDCC000BF0";
|
private static final String FOOTER = "015AA55AA5";
|
|
// 参数范围常量
|
private static final int MIN_SLOT_NUMBER = 0;
|
private static final int MAX_SLOT_NUMBER = 255;
|
|
/**
|
* 查询数据
|
*
|
* @param slotNumber 卡槽编号 (0-255)
|
* @return 生成的查询指令字符串
|
* @throws IllegalArgumentException 当参数超出范围时抛出
|
* @throws RuntimeException 当生成查询内容过程中发生错误时抛出
|
*/
|
public static String queryData(int slotNumber) {
|
// 参数校验
|
validateSlotNumber(slotNumber);
|
|
try {
|
String baseContent = buildBaseContent(slotNumber);
|
String contentWithTime = appendTimestamp(baseContent);
|
return buildFinalCommand(contentWithTime);
|
} catch (Exception e) {
|
throw new RuntimeException("生成查询内容时发生错误", e);
|
}
|
}
|
|
/**
|
* 验证卡槽编号参数
|
*/
|
private static void validateSlotNumber(int slotNumber) {
|
if (slotNumber < MIN_SLOT_NUMBER || slotNumber > MAX_SLOT_NUMBER) {
|
throw new IllegalArgumentException(
|
String.format("卡槽编号必须在%d-%d范围内", MIN_SLOT_NUMBER, MAX_SLOT_NUMBER));
|
}
|
}
|
|
/**
|
* 构建基础内容
|
*/
|
private static String buildBaseContent(int slotNumber) {
|
String slotHex = decimalToHex(slotNumber, 2);
|
return HEADER + slotHex + FOOTER;
|
}
|
|
/**
|
* 添加时间戳
|
*/
|
private static String appendTimestamp(String baseContent) {
|
long timestamp = System.currentTimeMillis() / 1000;
|
String timeHex = Long.toHexString(timestamp).toUpperCase();
|
return baseContent + timeHex;
|
}
|
|
/**
|
* 构建最终命令(添加CRC校验)
|
*/
|
private static String buildFinalCommand(String content) {
|
byte[] cmdBytes = HexUtil.hexStringToBytes(content);
|
String crc = HexUtil.calculate(cmdBytes);
|
String finalContent = content + crc;
|
return finalContent;
|
}
|
|
/**
|
* 十进制转16进制
|
*
|
* @param decimal 十进制数字
|
* @param minLength 最小长度,不足时前面补0
|
* @return 16进制字符串(大写)
|
* @throws IllegalArgumentException 当十进制数为负数时抛出
|
*/
|
public static String decimalToHex(int decimal, int minLength) {
|
if (decimal < 0) {
|
throw new IllegalArgumentException("十进制数不能为负数: " + decimal);
|
}
|
|
String hex = Integer.toHexString(decimal).toUpperCase();
|
|
// 如果指定了最小长度且当前长度不足,则前面补0
|
if (minLength > 0 && hex.length() < minLength) {
|
hex = String.format("%0" + minLength + "d", 0).replace("0", "0") + hex;
|
hex = hex.substring(hex.length() - minLength);
|
}
|
|
return hex;
|
}
|
|
/**
|
* 十进制转16进制(不指定最小长度)
|
*
|
* @param decimal 十进制数字
|
* @return 16进制字符串(大写)
|
*/
|
public static String decimalToHex(int decimal) {
|
return decimalToHex(decimal, 0);
|
}
|
|
|
}
|