在 java 中将英特尔十六进制字符串转换为普通十六进制
Convert intel hex string to normal hex in java
我有一个 intel 十六进制格式 的字符串,需要将其转换为十六进制格式,然后再从那里转换为十进制。数据是从 gps 设备发送的。
这是我应该得到的结果
Intel hex : 85630800 (input)
device hex : 00086385
decimal : 549765
我怎样才能得到这个?
我试图将英特尔十六进制转换为二进制(因为英特尔十六进制是二进制的 ascii 表示)并将二进制转换为十六进制,但它没有为输入 85630800(英特尔十六进制)提供值 00086385(十六进制)
我正在查看这个库 Java Intel 十六进制解析器 https://github.com/j123b567/java-intelhex-parser
但这讨论的是将英特尔十六进制文件转换为二进制格式而不是字符串。我想看看我是否可以使用代码(部分或全部),但它似乎真的太过分了。
也在查看 Convert Intel HEX file to binary file 但它是针对 python 的。
一旦我将它转换为正常的十六进制,我就可以使用 Integer.ParseInt() 或 Long.ParseInt() 作为十进制。
但我无法将 intel 十六进制字符串转换为正常的十六进制格式。有没有办法将 intel 十六进制字符串转换为正常的十六进制字符串或 java 中的值?
更新
阅读答案后,我意识到要问的正确问题是如何将 Little endian 十六进制字符串转换为 Big endian。我拥有的 GPS 设备的文档将格式指定为 intel hex(可能是因为基于 Intel 的处理器是小端),这让我无法理解我拥有的数据格式。
如果您需要将小端十六进制字符串转换为大端十六进制字符串,您可以从以下代码片段开始。根据您在大局中需要解决的问题,可能需要进行一些调整。
String s = "85630800";
StringBuilder sb = new StringBuilder(s.length());
for (int i = s.length() - 2; i >= 0; i -= 2) {
sb.append(s.charAt(i)).append(s.charAt(i+1));
}
System.out.println(sb);
输出
00086385
Integer 的能力可以提供帮助,class 的人应该阅读 java
的文档
int input = (int) Long.parseLong("85630800", 16); // 0x85630800
int result = Integer.reverseBytes(input);
由于十六进制字符串可以大于 signed int 值,最好使用 long。
附录
自 java 8: parseUnsignedInt.
int input = Integer.parseUnsignedInt("85630000", 16);
我有一个 intel 十六进制格式 的字符串,需要将其转换为十六进制格式,然后再从那里转换为十进制。数据是从 gps 设备发送的。
这是我应该得到的结果
Intel hex : 85630800 (input)
device hex : 00086385
decimal : 549765
我怎样才能得到这个?
我试图将英特尔十六进制转换为二进制(因为英特尔十六进制是二进制的 ascii 表示)并将二进制转换为十六进制,但它没有为输入 85630800(英特尔十六进制)提供值 00086385(十六进制)
我正在查看这个库 Java Intel 十六进制解析器 https://github.com/j123b567/java-intelhex-parser
但这讨论的是将英特尔十六进制文件转换为二进制格式而不是字符串。我想看看我是否可以使用代码(部分或全部),但它似乎真的太过分了。
也在查看 Convert Intel HEX file to binary file 但它是针对 python 的。
一旦我将它转换为正常的十六进制,我就可以使用 Integer.ParseInt() 或 Long.ParseInt() 作为十进制。
但我无法将 intel 十六进制字符串转换为正常的十六进制格式。有没有办法将 intel 十六进制字符串转换为正常的十六进制字符串或 java 中的值?
更新
阅读答案后,我意识到要问的正确问题是如何将 Little endian 十六进制字符串转换为 Big endian。我拥有的 GPS 设备的文档将格式指定为 intel hex(可能是因为基于 Intel 的处理器是小端),这让我无法理解我拥有的数据格式。
如果您需要将小端十六进制字符串转换为大端十六进制字符串,您可以从以下代码片段开始。根据您在大局中需要解决的问题,可能需要进行一些调整。
String s = "85630800";
StringBuilder sb = new StringBuilder(s.length());
for (int i = s.length() - 2; i >= 0; i -= 2) {
sb.append(s.charAt(i)).append(s.charAt(i+1));
}
System.out.println(sb);
输出
00086385
Integer 的能力可以提供帮助,class 的人应该阅读 java
的文档int input = (int) Long.parseLong("85630800", 16); // 0x85630800
int result = Integer.reverseBytes(input);
由于十六进制字符串可以大于 signed int 值,最好使用 long。
附录
自 java 8: parseUnsignedInt.
int input = Integer.parseUnsignedInt("85630000", 16);