java - 在 Java 中,为什么我的字节数组的元素包含 2 个字节?

标签 java android

我正在编写一个基于 Java 的小型 Android 应用程序,该应用程序从蓝牙芯片接收基于 c 的 unsigned char[] 字节数组并将其流式传输到字节数组中。

尽管它是 Android 和蓝牙这一事实应该无关紧要,这只是背景。但是,如果这有所不同,我将使用最低 API 8。

主要代码为:

InputStream is = socket.getInputStream();
DataInputStream dis = new DataInputStream(is);
byte[] buffer = new byte[1024];
bytesRead = dis.read(buffer, 0, 1024);

但是,当我查看缓冲区的实际内容时,我看到了:

[0] 15 [0xf] [^O]   
[1] 15 [0xf] [^O]   
[2] 0 [0x0] [^@ (NUL)]  
[3] -119 [137] [0x89] [^É]  
[4] 2 [0x2] [^B]    
[5] 6 [0x6] [^F]    
[6] 26 [0x1a] [^Z]  
[7] -47 [209] [0xd1] [Ñ]    
[8] -1 [255] [0xff] [ÿ] 
[9] 104 [0x68] [h]  
[10]    -1 [255] [0xff] [ÿ] 
[11]    -46 [210] [0xd2] [Ò]    
[12]    -1 [255] [0xff] [ÿ] 
[13]    104 [0x68] [h]  
[14]    -19 [237] [0xed] [í]    
[15]    -128 [128] [0x80] [^À]  

上面是从eclipse Expression View 中复制出来的设置显示

  1. 元素[#]
  2. 有符号整数值
  3. 如果是负数,unsigned int value [这个值不会出现,除非#2 是负数]
  4. 十六进制值
  5. ASCII 值

我的问题是,如果这是一个字节数组,为什么有些十六进制值包含 2 个字节。查看元素6到14,每个元素的形式为0x1a、0x12、0xff等。字节0到5都是一个字节(元素3除外)。

我认为这不是蓝牙方面的问题,因为我看到了实际的代码,它是一个无符号的 char[] 数组,每个元素只有一个字节。另外,我记得在之前的一个涉及从在线 API 获取数据流的小项目中看到过类似的东西。

如何确保 Java 数组元素仅包含 1 个字节?就此而言,我觉得我没有理解有关 Java 的一些重要内容,因为这让我感到困惑——Java 怎么允许一个字节数组的每个元素包含一个以上的字节?

最佳答案

你混淆了字节和十六进制数字。

一个字节包含 8 位。十六进制数字从 0 到 F,因此只有 4 位(16 个值,16 = 2^4,因此是 4 位)。因此,单个字节使用两个十六进制数字表示。

0xf 等同于 0x0f。前4位全0,后4位全1。

关于java - 在 Java 中,为什么我的字节数组的元素包含 2 个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15828460/

相关文章:

Java:停止没有同步的线程

java - Sugarcrm - 通过 REST 的 session ID 无效 - 帖子太大?

java - 打破网格线

android - 将我的小部件与我的应用程序集成

java - 驱动程序管理器无法解析为类型

android - 传递 .aar 依赖项

java - 无法将 Android Studio 与 Maven 存储库同步

android - 如何通过 Android 上的 Intent 启动 "Navigation for google maps go"

android:多语言数据库问题

java - 如何将字节数组中的特定字节转换为整数