代码之家  ›  专栏  ›  技术社区  ›  E.S.

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

  •  1
  • E.S.  · 技术社区  · 13 年前

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

    事实上,它是安卓和蓝牙并不重要,这只是背景。但是,如果有区别的话,我使用的是最低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视图集的副本,用于显示

    1. 元素[#]
    2. 带符号的int值
    3. 如果为负数,则无符号int值[除非#2为负数,否则此值不会出现]
    4. 十六进制值
    5. ASCII值

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

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

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

    2 回复  |  直到 13 年前
        1
  •  5
  •   JB Nizet    13 年前

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

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

    0xf 相当于 0x0f 前4个比特全部为0,最后4个比特均为1。

        2
  •  0
  •   parkydr    13 年前

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