【问题标题】:Convert intel hex string to normal hex in java在java中将intel十六进制字符串转换为普通十六进制
【发布时间】:2016-01-01 18:44:46
【问题描述】:

我有一个 intel 十六进制格式 的字符串,它需要转换为十六进制格式,然后从那里转换为十进制。数据是从 GPS 设备发送的。

这是我应该得到的结果

Intel hex  : 85630800 (input)

device hex : 00086385 

decimal    : 549765 

我怎样才能得到这个?

我试图将 intel hex 转换为二进制(因为 intel hex 是二进制的 ascii 代表)和二进制到十六进制,但它没有给我输入 85630800(intelhex) 的值 00086385(hex)

我现在正在查看这个库 Java Intel hex parser https://github.com/j123b567/java-intelhex-parser

但这谈到将 intel 十六进制文件转换为二进制格式而不是字符串。我正在尝试查看是否可以使用代码(部分或全部),但它似乎真的有点矫枉过正。

还查看Convert Intel HEX file to binary file,但它适用于 python 。

一旦我把它转换成普通的十六进制,我就可以使用 Integer.ParseInt() 或 Long.ParseInt() 来表示十进制。

但我无法将 intel 十六进制字符串转换为正常的十六进制格式。有没有办法将 intel 十六进制字符串转换为普通的十六进制字符串或 java 中的值?

更新

阅读答案后,我意识到要问的正确问题是如何将 Little endian 十六进制字符串转换为 Big endian 。我拥有的 GPS 设备的文档将格式指定为 intel hex(可能是因为基于 Intel 的处理器是小端序),这让我无法理解我拥有的数据格式。

【问题讨论】:

  • 当您说“intel hex format”时,您的意思是“little-endian”,对吗?您可以只交换字符串中的字节,也可以将其解析为当前格式的整数并切换整数中的字节。您在这两个方面尝试过什么?
  • @JonSkeet 告诉你我不知道的真相!我的文档说一个特定的值是 intel 十六进制格式(85630800),它的正常十六进制值是 this(00086385) 和十进制值是 this(549765) 。我需要在java代码中进行转换。我在想英特尔十六进制意味着en.wikipedia.org/wiki/Intel_HEX
  • 好的。好吧,正如我所说 - 你可以这样做。你有没有尝试过任何东西?只是字符串操作会有点难看但有效(只需四次调用子字符串,将结果连接在一起......)

标签: java hex


【解决方案1】:

Integer 的能力可以提供帮助,一类应该阅读的 javadoc。

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);

【讨论】:

  • 很好,这似乎是最佳解决方案。但是,更大的十六进制值呢? “FFFFFFFF”不会溢出吗?
  • 这是解决他问题的正确方法。应该让自己看看这个reverseBytes 东西的API。 ;-)
  • @Master Intel 架构 = little Endian,java BigEndian。该示例显示 4 个字节被反转(java int); 2(短)或 8(长)也是可能的。 Little endian 大约是最不重要的字节首先出现,在索引 0 处。对于嵌入 2/4/8 数字的其他大小的字节,请使用带有 order(LITTLE_ENDIAN) 的 ByteBuffer。
  • @JoopEggen 我明白了。我不熟悉ByteBuffer,但如果我有类似的问题,我会记住的。谢谢。
【解决方案2】:

如果您需要将小端十六进制字符串转换为大端十六进制字符串,您可以从以下 sn-p 开始。根据您需要在大局中解决的问题,可能需要进行一些调整。

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

【讨论】:

  • pffff,我正要发布它! :P 让我将十六进制添加到 int 转换 Integer.parseInt(sb.toString(), 16);
  • 再想一想,最好用Long.parseLong(sb.toString(), 16) 转换它以避免溢出。
猜你喜欢
  • 1970-01-01
  • 2018-01-22
  • 2013-12-01
  • 2015-04-30
  • 2018-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
相关资源
最近更新 更多