6

我正在开发一个基于 BluetoothChat 示例代码的应用程序。我需要能够将包含十六进制值的字节数组写入输出流。我还需要解析输入流上的字节数组并读取十六进制值。这是我的代码,只是简单地将十六进制值写入字节数组

byte[] data = new byte [3];
data[0] = (byte) 0x53;
data[1] = (byte) 0x1C;
data[2] = (byte) 0X06;

但是,当单步调试并查看“数据”时,调试器将值显示为 data[0]=83、data[1]=28、data[2]=6。为什么所有的值都转换为ascii?当我在读取输入流时观看 byte[] 缓冲区时,也会发生同样的事情。

 // Read from the InputStream
 bytes = mmInStream.read(buffer);

我发送了一个包含十六进制值的字节数组,但 byte[] 缓冲区显示的是 ascii 值。如何通过蓝牙读取和写入原始十六进制值?一些读/写流将是短的 <15 字节的命令流。但我还需要读取一个编码为十六进制字节的大文件。对该输入流有什么建议吗?我需要使用 BufferedInputStream 吗?

4

1 回答 1

8

当你写

int answer = 42;
System.out.println(answer);

int存储在变量中的值将answer转换为 a String,然后显示在您的监视器上。这同样适用于在 IDE 的调试器中显示值。最终,所有数字数据都被转换为 ASCII(或其他一些字符编码)以便显示。在任何编程语言中都是如此。

现在我们可能想知道这种转换是如何发生的。默认情况下,该int值将转换为其十进制表示形式。这是大多数人习惯阅读并期望看到的。作为程序员,我们有时需要考虑值的十六进制表示int,例如您在代码中所做的。但是,计算机不会仅仅因为我们使用十六进制表示设置变量的值而自动知道这一点。特别是,您的 IDE 仍默认以int十进制表示形式显示所有数据。

Fortunately, IDE designers are programmers and realize that we sometimes need to see int data in a different form. You can change the setting for your debugger to display int data as hexadecimal. Since the steps to do this depends on your IDE, you should check the help files for details.

于 2012-11-08T21:29:06.250 回答