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

时间:2013-04-05 07:43:51

标签: java android

我正在编写一个基于Java的小应用程序,它从蓝牙芯片接收基于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视图设置为show

的副本
  1. 元素[#]
  2. 签名的int值
  3. 如果为负,则无符号整数值[此值不会出现,除非#2为负数]
  4. 十六进制值
  5. ASCII值
  6. 我的问题是,如果这是一个字节数组,为什么一些Hex值包含2个字节。查看元素6到14,每个元素的格式为0x1a,0x12,0xff等。字节0到5都是一个字节(元素3除外)。

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

    如何确保Java数组元素只包含1个字节?就此而言,我觉得我不理解Java的重要部分,因为这让我感到困惑 - Java如何允许字节数组每个元素包含多个字节?

2 个答案:

答案 0 :(得分:5)

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

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

0xf相当于0x0f。前4位全为0,后4位均为1。

答案 1 :(得分:0)

一个字节是8位,因此可以保持0 - (2 ^ 8 - 1),即0-255(0x0 - 0xff)。您的所有值都是单个字节。