概述
最近想起之前做的IOT项目,使用JAVA写了一个<ascii to hex> 示例,防止误删,在此做个笔录,方便后续查阅;同时,希望能帮助到有用的攻城狮们,加油加油!
IDE:IntelliJ IDEA 2020.2
JDK:jdk-11.0.8_windows-x64_bin.exe
一、代码
public class Main {
public static void main(String[] args) throws NumberFormatException {
System.out.println("\n***** Convert ASCII to Hex *****");
//String str = "I Love Java!";
String str = "862177040021951";
// String str = "163";
System.out.println("Original input : " + str);
String hex = convertStringToHex(str);
System.out.println("\n***** Convert Hex to ASCII *****");
System.out.println("Hex : " + hex);
System.out.println("ASCII : " + convertHexToString(hex));
String val = "343630313131313734333036393430";
System.out.println("NB-IOT设备的IMEI号值为:" + convertHexToString(val));
System.out.println("****************************************************\n");
hex = convertStringToHex("460111174306940");
System.out.println("\n***** Convert Hex to ASCII *****");
System.out.println("Hex : " + hex);
System.out.println("ASCII : " + convertHexToString(hex));
String vall = "226";
System.out.println("NB-IOT设备的IMSI号值为:" + convertHexToString(vall));
// System.out.println("******************************************\n");
// String Latitude = "10D17C0D";
// System.out.println("经度值为:" + convertHexToFloat(Latitude));
// System.out.println("******************************************\n");
// String Longitude = "80C9DD43";
// System.out.println("纬度值为:" + convertHexToFloat(Longitude));
// String s="80C9DD43";
// Float value = Float.intBitsToFloat(Integer.valueOf(s.trim(), 16));
// System.out.println(value);
//
// Float f=0.15490197f;
// System.out.println(Integer.toHexString(Float.floatToIntBits(f)));
Test test = new Test();
String str16 = "M5311-MCMH0S03,HT_Manhole_V2.1_191209,HT_12221_V2.0_190715,868163040748607,460040829606402,898602B8261870737402,19/12/10,14:01:41,2,2,0,255,255,16,21,3.80,24.9,0,0,86,0";
String crc2Code = test.getCRC2Code(str16.getBytes());
System.out.println("crc2Code:" + crc2Code);
System.out.println("len:" + str16.length());
System.out.println("len:" + str16.getBytes().length);
}
public static String convertStringToHex(String str) {
char[] chars = str.toCharArray();
StringBuffer hex = new StringBuffer();
for (int i = 0; i < chars.length; i++) {
hex.append(Integer.toHexString((int) chars[i]));
}
return hex.toString();
}
public static String convertHexToString(String hex) {
StringBuilder sb = new StringBuilder();
StringBuilder temp = new StringBuilder();
//49204c6f7665204a617661 split into two characters 49, 20, 4c...
for (int i = 0; i < hex.length() - 1; i += 2) {
//grab the hex in pairs
String output = hex.substring(i, (i + 2));
//convert hex to decimal
int decimal = Integer.parseInt(output, 16);
//convert the decimal to character
sb.append((char) decimal);
temp.append(decimal);
}
System.out.println("Decimal : " + temp.toString());
return sb.toString();
}
public static String convertHexToFloat(String hex) {
StringBuilder sb = new StringBuilder();
StringBuilder temp = new StringBuilder();
return sb.toString();
}
public static class Test {
public String getCRC2Code(byte[] bytes) {
// ModBus 通信协议的 CRC ( 冗余循环校验码含2个字节, 即 16 位二进制数。
// CRC 码由发送设备计算, 放置于所发送信息帧的尾部。
// 接收信息设备再重新计算所接收信息 (除 CRC 之外的部分)的 CRC,
// 比较计算得到的 CRC 是否与接收到CRC相符, 如果两者不相符, 则认为数据出错。
//
// 1) 预置 1 个 16 位的寄存器为十六进制FFFF(即全为 1) , 称此寄存器为 CRC寄存器。
// 2) 把第一个 8 位二进制数据 (通信信息帧的第一个字节) 与 16 位的 CRC寄存器的低 8 位相异或, 把结果放于 CRC寄存器。
// 3) 把 CRC 寄存器的内容右移一位( 朝低位)用 0 填补最高位, 并检查右移后的移出位。
// 4) 如果移出位为 0, 重复第 3 步 ( 再次右移一位); 如果移出位为 1, CRC 寄存器与多项式A001 ( 1010 0000 0000 0001) 进行异或。
// 5) 重复步骤 3 和步骤 4, 直到右移 8 次,这样整个8位数据全部进行了处理。
// 6) 重复步骤 2 到步骤 5, 进行通信信息帧下一个字节的处理。
// 7) 将该通信信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换。
// 8) 最后得到的 CRC寄存器内容即为 CRC码。
int CRC = 0x0000ffff;
int POLYNOMIAL = 0x0000a001;
int i, j;
for (i = 0; i < bytes.length; i++) {
CRC ^= (int) bytes[i];
for (j = 0; j < 8; j++) {
if ((CRC & 0x00000001) == 1) {
CRC >>= 1;
CRC ^= POLYNOMIAL;
} else {
CRC >>= 1;
}
}
}
//高低位转换,看情况使用(通讯开发就规定校验码高位在前低位在后,也就不需要转换高低位)
//CRC = (CRC & 0x0000FF00) >> 8 | ( (CRC & 0x000000FF ) << 8);
return Integer.toHexString(CRC);
}
}
public static long parseLong(String s, int radix) throws NumberFormatException {
if (s == null) {
throw new NumberFormatException("null");
}
if (radix < Character.MIN_RADIX) {
throw new NumberFormatException("radix " + radix + " less than Character.MIN_RADIX");
}
if (radix > Character.MAX_RADIX) {
throw new NumberFormatException("radix " + radix + " greater than Character.MAX_RADIX");
}
long result = 0;
boolean negative = false;
int i = 0, len = s.length();
long limit = -Long.MAX_VALUE;
long multmin;
int digit;
if (len > 0) {
char firstChar = s.charAt(0);
if (firstChar < '0') { // Possible leading "+" or "-"
if (firstChar == '-') {
negative = true;
limit = Long.MIN_VALUE;
} else if (firstChar != '+')
throw NumberFormatException.forInputString(s);
if (len == 1) // Cannot have lone "+" or "-"
throw NumberFormatException.forInputString(s);
i++;
}
multmin = limit / radix;
while (i < len) {
// Accumulating negatively avoids surprises near MAX_VALUE
digit = Character.digit(s.charAt(i++), radix);
if (digit < 0) {
throw NumberFormatException.forInputString(s);
}
if (result < multmin) {
throw NumberFormatException.forInputString(s);
}
result *= radix;
if (result < limit + digit) {
throw NumberFormatException.forInputString(s);
}
result -= digit;
}
} else {
throw NumberFormatException.forInputString(s);
}
return negative ? result : -result;
}
}
class NumberFormatException extends IllegalArgumentException {
/**
*
*/
private static final long serialVersionUID = 1L;
public NumberFormatException(String s) {
super(s);
}
static NumberFormatException forInputString(String s) {
return new NumberFormatException("For input string: \"" + s + "\"");
}
}
二、运行结果
三、总结
多劳多得,加油加油 ^_^ !!!