2016-04-15 24 views
0

我試圖開發一個Android應用程序,我需要在字符串內添加一個字節值(8位)並在byte []中再次讀回。如何將一個字節值(8位)添加到字符串並在Java中以字節讀回

但是,當我再次使用getBytes()將字符串轉換爲byte []時,我得到了一些不同的值。我認爲它的一些編碼或字符集問題。

BTW我是新來的Java編程我在C.

代碼大多代碼:

void function(void) 
{ 
    String a = "bla"; 
    char x = (0xD0 & 0xFF); //Need to add & read back '0xD0' 
    a += x; 
    Log.d(TAG,"TEST: "+a); 

    String mm = "-- "; 
    byte[] buffer = null; 
    try { 
     buffer = a.getBytes("US-ASCII"); 
    } catch (UnsupportedEncodingException e) { 
     Log.e(TAG, e.getMessage()); 
    } 
    for (int i = 0; i < buffer.length; i++) { 
     mm+=" "+Integer.toHexString(buffer[i]); 
    } 

    Log.e(TAG, "Len:"+buffer.length+mm); 
} 

輸出:

TEST: bla￐ 
Len:4-- 62 6c 61 3f 

預計:

Len:4-- 62 6c 61 d0 

找到了解決方案: 現在我使用編碼UTF-16LE,這不鬆散數據,併發送偶數字節,跳過奇數字節

解決方案:

void function(void) 
{ 
    String a = "bla"; 
    char x = 0xD0; 
    a += x; 
    Log.d(TAG,"TEST: "+a); 

    String mm = "-- "; 
    byte[] buffer = null; 
    try { 
     buffer = a.getBytes("UTF-16LE"); 
    } catch (UnsupportedEncodingException e) { 
     Log.e(TAG, e.getMessage()); 
    } 
    for (int i = 0; i < buffer.length;) { 
     mm += i +":"+Integer.toHexString(buffer[i]) + ","; 
     /* Skip odd bytes as using "UTF-16LE" encoding */ 
     i+=2; 
    } 

    Log.e(TAG, "Len:"+buffer.length+mm); 
} 

結果:

Len:8-- 0:62,2:6c,4:61,6:ffffffd0, 
+0

'byte's被簽名爲-128到127,'char's爲0到65535.由於符號的擴展,你可能會在'String'中加'char' 0xFFD0。 – AJNeufeld

+0

是的,但是通過'(byte)x'給出'Len:6--62 6c 61 2d 34 38',並用'和'來表示0xff,我將它轉換爲無符號。我不明白'3f'是如何到達那裏的。 –

+0

「0xD0&0xFF」是「0xD0」。 「(字節)(0xD0&0xFF)」是-48。 – AJNeufeld

回答

2

如Java創建的,他們提出二進制數據byte[], InputStream, OutputStream)和區分Unicode文本String, char, Reader, Writer)。這意味着byte是8位,char是16位,包含UTF-16。現在,UTF-16編碼Unicode文本 - 其中字符(「代碼點」)被編號爲3字節範圍 - 有時需要兩個2字節字符的格式。總而言之,你不能使用任意的字符。隱式或顯式轉換總是很昂貴的。

更好地使用ByteArrayInputStream和ByteArrayOutputStream,它可以用來收集可變數量的字節,然後檢索byte[]

如果仍然存在,您可以從ISO-8859-1這樣的1字節編碼轉換。

String s = "blah\u00d0"; 
String s = "blah" + '\u00d0'; 
String s = "blah" + ((char)0x00d0); // < 0x100 still in safe range 
byte[] b = s.getBytes("ISO-8859-1"); 
s = new String(b, "ISO-8859-1"); 

與C的另一個區別是\u0000是字符串中的正常字符。

0

這個怎麼樣:

String s = "Hello"; 
s += (char)((byte)0xD0 & 0xFF); 

s == "HelloÐ"

Integer.toHexString(s.charAt(s.length()-1) & 0xff) == "d0" 

要指定編碼而獲得,如果你需要一個特定的編碼通過網絡或其它地方

送你能做s.getBytes("UTF-8");字節你可以創建一個從編碼字節一個新的String這樣String s = new String(utfByteArray, "UTF-8");

+0

謝謝,但我基本上試圖在字節[]數組中''D0''而不是'-48',基本上我需要通過串行端口將'D0'作爲單個字節傳輸。我試着按照你的說法,但仍然得到'3f' –

+0

剛剛更新我的答案(如果它告訴你,我是新的這個網站IDK) –