字节[]到Java中的字符串:输出意味着什么?

字节[]到Java中的字符串:输出意味着什么?,java,bytearray,hex,Java,Bytearray,Hex,因此,我在尝试使读卡器在多功能打印机上正常工作时遇到了一些问题,我将问题缩小到当字节[]作为构造函数参数传递时字符串输出的奇怪值。我无法真正通过MFP调试应用程序,而且日志记录工具也不能与读卡应用程序一起工作(伙计们,这是嵌入式编程的世界!),所以我的调试工作基本上是基于在屏幕上打印值,有时候,这些值的行为并不像您希望的那样 好了,我们开始吧:当我在读卡器上“刷”卡时,我的Java程序收到一个字节[]。现在,有两种方式可以显示它: //Supposing that bytes is th

因此,我在尝试使读卡器在多功能打印机上正常工作时遇到了一些问题,我将问题缩小到当字节[]作为构造函数参数传递时字符串输出的奇怪值。我无法真正通过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
嗯。第一个输出“35383536”。十六进制值有点奇怪,但它实际上是正确的值;因为我做了一个测试:

    byte[] bytes = {0x35, 0x38, 0x35, 0x35, 0x36};
    BigInteger bi = new BigInteger(bytes);
    System.out.println(bi.toString(16));
考虑到它返回相同的值(35383536),我将把它作为实际的byte[]值。现在,当我尝试第二种方法时:

    new String(bytes);
在本例中,我的返回值是58556。更糟糕的是,事情并不是每次都那么愉快,就像一场争论一样

    {(byte)9F, (byte)0xA8, (byte)0xEE};
将输出[制表符-实际上是制表符,而不是写入制表符]

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

很抱歉,关于一个可以用两行文字概括的问题的帖子太长了,但是我想把所有的事情都说清楚,以便得到一个直接、快速的答案


编辑:谢谢大家的意见,我收到了。现在我不知道我是否应该考虑ASCII值(58556)或HEX(“0x3538 353536”)——也就是说,如果它实际上应该被解释为十六进制-但这是我要向开发人员提出的问题。

< P>正如JavaDoc所说,<代码>字符串(字节)< /代码>“通过使用平台的默认字符集解码指定的字节数组来构造新字符串”

因此,它将数据解释为以字节格式存储的字符


另一方面,ToString将数据转换为您期望的字符串表示形式。

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

BigInteger构造函数与字符串构造函数不同。根据Javadoc:

public BigInteger(byte[] val)

将包含双整数的二元补码二进制表示形式的字节数组转换为双整数。输入数组假定为大端字节顺序:最高有效字节位于第零个元素。

重要的部分是读卡器提供给您的数据的格式。提示:
0x3n
是ASCII码吗字符数字“n”的de(即“7”的ASCII代码为0x37)。那么这将是35383536。但我仍然想知道58556的含义(实际上是有原因的)请注意“新字符串(字节)”“将在不同的平台上工作,这取决于平台的默认字符编码。如果不指定编码,它就不是最可靠的。0x35、0x38、0x35、0x35、0x36是字符串“58556”的ASCII/UTF-8代码,因此这些结果是一致的。你想要什么数据?aaaawwww,我明白了。。。我没有意识到这种模式(“0x3n”)。我认为它可能是任何东西(例如0xAA),我认为0x3n只是一个相当奇怪的巧合。感谢您的输入,这将作为一个答案。