2013-04-05 27 views
1

我正在編寫一個小型的基於Java的Android應用程序,它從藍牙芯片接收一個基於c的unsigned char []字節數組並將其流式傳輸到一個字節數組中。在Java中,爲什麼我的字節數組的元素包含2個字節?

雖然它是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] [^À] 

以上是從蝕表達視圖副本設定爲顯示

  1. 元素[#]
  2. 符號int值
  3. 如果是負數,無符號整型值,該值不會出現,除非#2負]
  4. 十六進制值
  5. ASCII值

我的問題是,如果這是一個字節數組,爲什麼是一些包含2個字節的十六進制值。看看元素6到14,它們都是0x1a,0x12,0xff等形式。字節0到5都是一個字節(元素3除外)。

我不認爲這是藍牙方面的問題,因爲我看到了實際的代碼,並且它是一個無符號的char []數組,每個元素只有一個字節。另外,我記得在之前的一個涉及從在線API獲取數據流的小項目中看到類似的情況。

如何確保Java數組元素只包含1個字節?而對於這個問題,我覺得我不瞭解Java的一些重要內容,因爲這讓我感到困惑 - Java如何允許一個字節數組在每個元素中包含多個字節?

+0

我剛剛意識到,也許我應該使用ByteArrayInputStream而不是DataInputStream ...但不管怎樣,每個元素包含多於1個字節的字節數組的這個問題不應該出現。 – 2013-04-05 07:46:38

+0

十六進制字符需要4位,所以FF = 1111 1111 - >一個字節 0,1,2,4和5的值足夠小,可以用4位表示,全部是 – 2013-04-05 07:51:30

回答

5

你在混淆字節和十六進制數字。

一個字節包含8位。十六進制數字從0到F,因此只有4位(16個值,16 = 2^4,因此4位)。單字節因此用兩個十六進制數字表示。

0xf相當於0x0f。前4位全爲0,後4位全爲1.

+0

Lol ...恥辱:(是的,我是把這兩個混在一起了,謝謝 – 2013-04-05 08:01:17

0

一個字節爲8位,所以可以保存0 - (2^8 - 1)即0-255(0x0 - 0xff)。你所有的值都是一個字節。

相關問題