package com.nanjing.water;
|
|
import org.junit.runner.RunWith;
|
import org.springframework.test.context.ContextConfiguration;
|
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
|
import java.math.BigInteger;
|
import java.time.LocalDateTime;
|
import java.time.format.DateTimeFormatter;
|
|
@RunWith(SpringJUnit4ClassRunner.class)
|
@ContextConfiguration(classes = SpringConfig.class)
|
public class DemoTest {
|
|
private static String dataq="FEFEFEFE687236123413EFF72281EDF6E001FFFEFF01060605040503FF070501FFFE040202FFC9363736373338383838373718F7372137373737372E0D1B81823737373737553725373736373737372732453700362F0037370037373737373718F71F332E3737344F3737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737371F332F3737344F3737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737371F33303737344F3737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737371F33313737344F3737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737371F33323737344F3737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737371F33333737344F3737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737371F33343737344F3737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737370AFF050637370306373737060504370506050704FE0503FF374516";
|
public static void main(String[] args) {
|
|
}
|
|
|
public static String decimalToHex(int decimal) {
|
return String.format("%02X", decimal);
|
}
|
|
// 将16进制字符串转换为字节数组
|
public static byte[] hexStringToByteArray(String hexString) {
|
int len = hexString.length();
|
byte[] data = new byte[len / 2];
|
for (int i = 0; i < len; i += 2) {
|
data[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4)
|
+ Character.digit(hexString.charAt(i+1), 16));
|
}
|
return data;
|
}
|
|
// 计算累加和
|
public static int calculateChecksum(byte[] bytes) {
|
BigInteger sum = BigInteger.ZERO;
|
for (byte b : bytes) {
|
sum = sum.add(BigInteger.valueOf(b & 0xFF));
|
}
|
return sum.intValue();
|
}
|
|
|
|
/**
|
* 获取当前时间的BCD时间
|
* @return
|
*/
|
public static String timeBCD(){
|
// 获取当前日期和时间
|
LocalDateTime now = LocalDateTime.now();
|
|
// 提取年月日时分秒
|
int year = now.getYear() % 100; // 取年份的后两位
|
int month = now.getMonthValue();
|
int day = now.getDayOfMonth();
|
int hour = now.getHour();
|
int minute = now.getMinute();
|
int second = now.getSecond();
|
StringBuilder stringBuilder = new StringBuilder(padZero(year));
|
stringBuilder.append(padZero(month))
|
.append(padZero(day))
|
.append(padZero(hour))
|
.append(padZero(minute))
|
.append(padZero(second));
|
return stringBuilder.toString();
|
}
|
|
/**
|
* 不足两位变成两位
|
* @param decimal
|
* @return
|
*/
|
public static String padZero(int decimal) {
|
return String.format("%02d", decimal);
|
}
|
|
|
// 原文数据按字节取反,然后再加上38H
|
public static String reverseAndAdd38H(String decimalString ,int length) {
|
|
// 如果字符串长度小于规定的位数,则在前面添加0,使其达到规定的位数
|
while (decimalString.length() < length) {
|
decimalString = "0" + decimalString;
|
}
|
StringBuilder result = new StringBuilder();
|
for (int i = 0; i < decimalString.length(); i += 2) {
|
// 每次取两个字符作为一个单位
|
String unit = decimalString.substring(i, i + 2);
|
// 将每个单位解析为16进制数值
|
int value = Integer.parseInt(unit, 16);
|
// 取反
|
value = ~value;
|
// 将其减去38H
|
value += 0x38;
|
|
// 获取最后两位
|
int lastTwoDigits = value & 0xFF; // 0xFF是16进制表示的255
|
// 将最后两位转换为16进制字符串
|
String hexResult = Integer.toHexString(lastTwoDigits);
|
// 不足两位的情况补0
|
if (hexResult.length() < 2) {
|
hexResult = "0" + hexResult;
|
}
|
// 将结果追加到StringBuilder中
|
result.append(hexResult);
|
}
|
return String.valueOf(result);
|
}
|
|
private static String hexStringToDecimalInt(StringBuilder hexString) {
|
StringBuilder result = new StringBuilder();
|
|
// 如果输入的字符串长度为奇数,补0使其长度为偶数
|
if (hexString.length() % 2 != 0) {
|
hexString = new StringBuilder("0" + hexString);
|
}
|
|
for (int i = 0; i < hexString.length(); i += 2) {
|
// 每次取两个字符作为一个单位
|
String unit = hexString.substring(i, i + 2);
|
// 将每个单位解析为16进制数值
|
int value = Integer.parseInt(unit, 16);
|
// 将其减去38H
|
value -= 0x38;
|
// 取反
|
value = ~value;
|
// 获取最后两位
|
int lastTwoDigits = value & 0xFF; // 0xFF是16进制表示的255
|
// 将最后两位转换为16进制字符串
|
String hexResult = Integer.toHexString(lastTwoDigits);
|
// 不足两位的情况补0
|
if (hexResult.length() < 2) {
|
hexResult = "0" + hexResult;
|
}
|
// 将结果追加到StringBuilder中
|
result.append(hexResult);
|
}
|
return String.valueOf(result);
|
}
|
|
public static String getCurrentTimeInBCD() {
|
LocalDateTime now = LocalDateTime.now(); // 获取当前系统时间
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); // 定义时间格式
|
String formattedDateTime = now.format(formatter); // 格式化时间为字符串
|
return Long.toHexString(Long.parseLong(formattedDateTime));
|
}
|
|
public static String hexStringToDecimalString(String hexString) {
|
// 将16进制字符串转换为对应的10进制字符串
|
String decimalString = new BigInteger(hexString, 16).toString();
|
return decimalString;
|
}
|
|
public static String reverseInPairs(String str) {
|
StringBuilder reversed = new StringBuilder();
|
// 从字符串末尾开始,每次取两个字符,并添加到reversed StringBuilder 中
|
for (int i = str.length() - 2; i >= 0; i -= 2) {
|
reversed.append(str.charAt(i)).append(str.charAt(i+1));
|
}
|
return reversed.toString();
|
}
|
private static String H16ToASCII(String s){
|
// 将字符串按两个字符一组进行分割
|
String[] hexPairs = s.split("(?<=\\G..)");
|
|
// 将每个十六进制数转换为对应的ASCII字符,并拼接成最终的ASCII字符串
|
StringBuilder asciiString = new StringBuilder();
|
for (String hexPair : hexPairs) {
|
int decimalValue = Integer.parseInt(hexPair, 16);
|
asciiString.append((char) decimalValue);
|
}
|
|
return asciiString.toString();
|
}
|
}
|