【问题标题】:byte[] to String in Java: What does the output mean?Java中的字节[]到字符串:输出是什么意思?
【发布时间】:2011-09-10 03:35:00
【问题描述】:

所以,我在尝试使读卡器在多功能打印机上正常工作时遇到了一些麻烦,我已将问题缩小到当 byte[] 作为传递时字符串输出的奇怪值构造函数参数。我无法通过 MFP 真正调试应用程序,并且日志工具根本无法与读卡应用程序一起工作(这就是你们的嵌入式编程世界,伙计们!),所以我的工作调试工作几乎基于打印有时,屏幕上的值并不完全符合您的要求。

好的,我们开始吧:当我在读卡器上“刷”卡时,我的 Java 程序会收到一个字节[]。现在,我可以通过两种方式显示它:

    //Supposing that bytes is the byte[] received
    BigInteger bi = new BigInteger(bytes); bi.toString(16); //I think it works fine
    String str = new String(bytes); //Suggested by the developer; sucks

好的。第一个输出“3538353536”。十六进制值有点奇怪,但它实际上是正确的值;因为我进行了测试:

    byte[] bytes = {0x35, 0x38, 0x35, 0x35, 0x36};
    BigInteger bi = new BigInteger(bytes);
    System.out.println(bi.toString(16));

考虑到它返回相同的值(3538353536),我将它作为实际的 byte[] 值。现在,当我尝试第二种方式时:

    new String(bytes);

在这种情况下,我的返回值是 58556。更糟糕的是,事情并不是每次都那么开心,就像作为参数传递类似

    {(byte)9F, (byte)0xA8, (byte)0xEE};

将输出 [tab - 真正的选项卡,而不是写选项卡] ¨î

我在一些地方读到新字符串(字节)是正确的方法,更重要的是它是读卡器开发人员的示例。但它不起作用。在我开始询问开发人员之前,我想知道这个输出与 bi.toString(16) 相比意味着什么,这似乎是正确的方法。

很抱歉,关于一个可以用两行概括的问题的相当长的帖子,但我想让所有内容都清晰明了,以便直接、快速地回答。

编辑:谢谢大家的意见,我明白了。现在我很困惑是否应该考虑 ASCII 值(58556)或十六进制(“0x3538353536”)——也就是说,如果它实际上应该被解释为十六进制——但这是我将向开发人员提出的问题。

【问题讨论】:

  • 重要的是你的读卡器给你的数据格式是什么。
  • 提示:0x3n 是字符数字“n”的 ASCII 码(即“7”的 ASCII 码是 0x37)。
  • 那将是 3538353536。但我还是想知道 58556 是什么意思(其实是有原因的)
  • 请注意,“new String(bytes)”在不同平台上的工作方式不同——这取决于平台的默认字符编码。如果不指定编码,这不是最可靠的。
  • 嗯,0x35, 0x38, 0x35, 0x35, 0x36 是字符串 "58556" 的 ASCII/UTF-8 编码,所以这些结果是一致的。您期待什么数据?

标签: java bytearray hex


【解决方案1】:

正如 javadocs 所说,String(bytes)“通过使用平台的默认字符集解码指定的字节数组来构造一个新的字符串”。

所以发生的事情是将数据解释为以字节格式存储的字符。如果您查看 ASCII 图表,您会看到 0x35 = '5' 等。

另一方面,ToString 将数据转换为字符串表示,正如您所期望的那样。

【讨论】:

  • AAAAAWWWW,我明白了......我没有意识到这种模式(“0x3n”)。我想它可以是任何东西(例如 0xAA),我认为 0x3n 只是一个相当奇怪的巧合。感谢您的意见,这将作为一个答案。
【解决方案2】:

您的原始字节数组{0x35, 0x38, 0x35, 0x35, 0x36} 转换为十进制数时为:{53, 56, 53, 53, 54},如果使用 ASCII 值转换将变为{'5', '8', '5', '5', '6'},因此您将使用平台的默认字符集获取字符串58556

BigInteger 构造函数 与 String 构造函数相同。根据 Javadoc:

public BigInteger(byte[] val)

将包含 BigInteger 的二进制补码表示的字节数组转换为 BigInteger。输入数组假定为大端字节序:最高有效字节在第零个元素中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 2018-05-01
    • 2012-05-25
    • 2011-06-10
    相关资源
    最近更新 更多