如何从 BluetoothChat 的输入/输出流中读取/写入原始十六进制字节?
Posted
技术标签:
【中文标题】如何从 BluetoothChat 的输入/输出流中读取/写入原始十六进制字节?【英文标题】:How do I read/write raw hex bytes from input/output stream in BluetoothChat? 【发布时间】:2012-10-29 04:18:40 【问题描述】:我正在开发一个基于 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 值。如何通过蓝牙读取和写入原始十六进制值?一些读/写流将是短的
【问题讨论】:
我不知道你有没有注意到,但 0x53 等于十进制 83,与 0x1C 和 28 相同。所以调试器转换为整数。 @JonathanCruz 0x53 是一个整数,与 83 一样多。不同之处在于所使用的表示。 @Code-Guru 0x53 是十六进制的,所以如果您计算 hex 53 == dec 83。如果您说它们都是字节,我会同意,但您会将整数与我认为的字节混淆。这不是转换问题,它只是您阅读它的方式 i.o.w.你戴什么眼镜才能看穿。向数组中添加 0x53 与添加 83 相同。 @JonathanCruz 我通常使用(并阅读)一般意义上的“整数”一词来表示整数。我使用“int”作为编程语言数据类型。我对“代表”这个词的强调是我说“你戴哪个眼镜”的方式。我的回答试图解释这个主题。 【参考方案1】:当你写作时
int answer = 42;
System.out.println(answer);
存储在answer
变量中的int
值将转换为String
,然后显示在您的显示器上。这同样适用于在 IDE 的调试器中显示值。 最终,所有数字数据都将转换为 ASCII(或其他字符编码)以便显示。在任何编程语言中都是如此。
现在我们可能想知道这种转换是如何发生的。默认情况下,int
值将转换为其十进制表示形式。这是大多数人习惯阅读并期望看到的。作为程序员,我们有时需要考虑int
值的十六进制表示,就像您在代码中所做的那样。但是,计算机不会仅仅因为我们使用十六进制表示设置变量的值而自动知道这一点。特别是,您的 IDE 仍默认以十进制表示形式显示所有 int
数据。
幸运的是,IDE 设计人员是程序员,并且意识到我们有时需要以不同的形式查看 int
数据。您可以更改调试器的设置以将int
数据显示为十六进制。由于执行此操作的步骤取决于您的 IDE,因此您应该查看帮助文件以了解详细信息。
【讨论】:
我正在使用 Eclipse IDE。我已将调试原语显示选项设置为显示十六进制值。所以看data的值的时候,其实是显示data[0]=83[0x53],data[1]=28[0x1C],data[2]=6[0x6]。问题是数组值的评估不正确。我的输入流接收一个字节数组,其中第一个字节应该包含 0x53。通过输入流解析时,我试图读取第一个字节是否为 0x53。所以在我的代码中, if(buffer[i]==53) 永远不会是真的。 由于 0x53 是十进制的 83,显然它永远不会等于 53(这是十进制数,而不是十六进制数)。也许您需要将 if 语句更改为if(buffer[i]==0x53)
。
好的,设置 buffer[i]==0x53 现在它似乎工作了。我想我挂断了显示十进制值的调试器,并认为这就是它评估我的字节数组的方式。感谢您的帮助。
调试器确实默认将你的字节数组评估为十进制。以上是关于如何从 BluetoothChat 的输入/输出流中读取/写入原始十六进制字节?的主要内容,如果未能解决你的问题,请参考以下文章
从 subprocess.communicate() 读取流输入