【发布时间】: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 编码,所以这些结果是一致的。您期待什么数据?