【问题标题】:How to translate byte received from serial port to hexadecimal?如何将从串口接收到的字节转换为十六进制?
【发布时间】:2013-04-14 20:46:04
【问题描述】:

我需要为我的传感器板读取串行端口,我使用这个example 来读取数据。 但令我惊讶的是控制台终端上的输出数据看起来像这样

Wÿðÿ8Ã?íÈÓÿ

因为我用这个System.out.print(new String(buffer,0,len)); 此方法每次接收数据包时都会打印数据。

但是当我将此方法用于六位数字时,输出将在接收任何数据之前写入零!!

这个方法

    byte[] arr = { 0x00, 0x01 };
    ByteBuffer wrapped = ByteBuffer.wrap(arr); // big-endian by default
    short  num = wrapped.getShort();
    String f=String.valueOf(num);
    System.out.print(f);

那么如何处理这个问题以将传入的字节转换为十六进制的可读数据!!!

【问题讨论】:

  • 您的代码与打印十六进制无关。你需要一些更简单的东西。试试Integer.toString(b & 0xFF, 16),其中b 是一个单独的字节。
  • 这段代码 new String(buffer,0,len) 使用平台默认编码将缓冲区转换为 String - 这就是为什么你会胡言乱语。
  • @bmorris591 怎么做?
  • @MarkoTopolnik,每次使用 buffer[len] 获取单个字节??
  • 我假设你有一个字节数组,所以遍历所有字节。

标签: java serialization serial-port hex bytearray


【解决方案1】:

试试这个:

final byte[] arr = new byte[] { 0x00, 0x01 }; // or whatever your byte array is
final String asHexStr = DatatypeConverter.printHexBinary(arr)
System.out.println(asHexStr);

【讨论】:

  • 为什么输出在收到任何数据之前写零?
  • @Hana90 - 不确定我是否关注你。您是否在问为什么在写入任何数据之前必须输出零。或者说当你打印数据时它前面有零?
  • 好吧,当我在我的问题中使用链接时使用 System.out.print(new String(buffer,0,len));每次端口收到数据时都会出现数据。但是当我使用另一种方法打印字节时,在接收到任何数据之前,我在输出端有零!
  • 与字节的打印方式有关?
  • @Hana90 - 不,打印输出的方式不可能改变inputStream.read 的行为。您很可能从流中获取数据,但格式不正确。
【解决方案2】:

您应该充分利用现有接口的潜力。考虑使用printf

byte[] arr = { 0x00, 0x01 };
ByteBuffer wrapped = ByteBuffer.wrap(arr); // big-endian by default
boolean read = true;
while(read)
  try { System.out.printf("%x",wrapped.get()); } //get each byte, print as hex
  catch(BufferUnderflowException ex) { read = false; } //stop at empty buffer
}

【讨论】:

    猜你喜欢
    • 2017-08-23
    • 1970-01-01
    • 2012-01-24
    • 2019-07-27
    • 2013-02-07
    • 2023-03-07
    • 2022-06-18
    • 2012-06-05
    • 2011-06-18
    相关资源
    最近更新 更多