2013-12-21 22 views
0

我想通過藍牙發送任何值,我的意思是值爲0-255,但我無法將此值轉換爲字符串中的字符。我嘗試了幾種不同的方式,但沒有成功。將字節轉換爲特殊字符Java

int a= 240 ; 
char z=(char)a; 
mConnectedThread.write("START"+"\240"+","+"\0240"+","+"\030"+","+Integer.toString(a)+","+z+","+"\0f1"+"STOP"); 

我得到這個(左 - 十進制值,以ASCII字符權值):

  • 83的 '
  • 84'T'
  • 65-「A '
  • 82- 'R'
  • 84- 'T'
  • 194-'A'
  • 160- ''
  • 44- ''
  • 20 - '\ 024'
  • 48 '0'
  • 44- ''
  • 24 - '\ 030'
  • 44- ''
  • 50 '2'
  • 52-'4'
  • 48 '0'
  • 44- ''
  • 195-'A '
  • 176- '°'
  • 44', '
  • 0 - '\ 0'
  • 102-'f'
  • 49-'1'
  • 83 -'S '
  • 84'T'
  • 79'O '
  • 80'P'

當我發送\030時,我收到一個字符24-'\30',但我不能發送更大的數字。

所以我的問題是:如何在一個字符串字符中設置/轉換0-255範圍內的任何值。我不需要顯示這一點,這並不重要。

+2

我不能肯定你問的是,Java字符並不總是一個字節(一個字節總是一個字節)。我認爲你只需要編碼你的字符,或使用'byte []'。 –

+0

你是如何將通過藍牙接收的字節數組轉換爲字符串的? –

+0

我不需要轉換這些數據,因爲它只是:command +一個很大的值(0-255)+結束命令,但是當我想把對象轉換成字符串時,我使用類似這樣的東西(而不是exacly):[link](http ://example.com)'bytes = mmInStream.read(buffer); \t \t \t \t \t \t字節[] newbuffer =新的字節[字節];對於(INT I = 0; I <字節;我++) \t \t newbuffer [I] =緩衝液[I]; \t final String data = new String(newbuffer,「US-ASCII」);' – user3126227

回答

0

編輯

如果你只想寫一個字符串流,而不將其轉換爲字節,可以使用的BufferedWriter:

OutputStreamWriter osw = new OutputStreamWriter(outputStream); 
BufferedWriter bufferedWriter = new BufferedWriter(osw); 
bufferedWriter.write("some string"); 

確保您瞭解從沖洗和close方法api: http://docs.oracle.com/javase/7/docs/api/java/io/BufferedWriter.html

這是java中非常標準的將低級別輸入/輸出流對象封裝到更高級別的讀寫器對象來訪問更方便的方法。

原來的答覆

可以使用字符串特定字符集解碼字節的構建: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#String(byte[], java.nio.charset.Charset)

US-ASCII可能是足以讓你的使用情況 http://docs.oracle.com/javase/7/docs/api/java/nio/charset/StandardCharsets.html

所以,你可以構造一個如下所示的字節數組:

new String(byteArray, StandardCharsets.US_ASCII); 
0

我接收和發送的字節[]的數據,它的工作不錯,但我認爲,馬金本上線會更好,bocouse當我做它看起來像這樣

byte[] dat = new byte[50]; 
     dat[i++] = (byte) '!'; 
     dat[i++] = (byte) '!'; 
     dat[i++] = (byte) 0xf0; 
     dat[i++] = (byte) 0xf0; 
     dat[i++] = (byte) SET_COUPLING; 
     dat[i++] = (byte) (coupling + 64*this.name); 
     dat[i++] = (byte) 0xf0; 
     dat[i++] = (byte) 0xf0; 
     dat[i++] = (byte)SET_MULTI; 

我只是在尋找數據表更好的方法來構造這個命令。 我的發送功能:

void write(String str) 
{ 
    if (STATE != CONNECTED) 
     return; 
    try 
    { 
     mmOutStream.write(str.getBytes()); 
    } catch (IOException e) 
    { 
     synchronized (MainActivity.this) 
     { 
      btDisconnect(); 
      changeState(CONNECTION_ERROR); 
      mConnectedThread = null; 
     } 
    } 
} 

或第二寫入功能使用字節[]:

void write(byte[] data) 
{ 
    if (STATE != CONNECTED) 
     return; 

    try 
    { 
     mmOutStream.write(data); 
    } catch (IOException e) 
    { 
     handler.post(new Runnable() 
     { 
      public void run() 
      { 
       btDisconnect(); 
       changeState(CONNECTION_ERROR); 
       mConnectedThread = null; 
      } 
     }); 
    } 
} 

我知道我在這個轉換成字符串使用mmOutStream.write(str.getBytes的byte []() );,但我認爲,製作字符串命令,然後轉換int byte []是更優雅的方法。 我認爲很簡單的方法,使這就像sprintf的

sprintf(str,"%4.1f\xdf""C", temp); 

其中「\ XDF」只是在一個字節223是等級標記,當我把這個變成字母數字顯示器