2016-04-15 8 views
0

文字列の中にバイト値(8ビット)を追加する必要があるAndroidアプリケーションを開発しようとしています再度バイト[]でそれを読んでください。文字列にバイト値(8ビット)を追加してJavaのバイト単位で読み込む方法

しかし、文字列をbyte []に​​変換するともう一度getBytes()を使用して別の値が得られます。私はいくつかのエンコーディングまたは文字セットの問題だと思います。

ところで、私はC.

で、私はほとんどのコード

コードJavaプログラミングに新しいです:

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になります。符号拡張のためにおそらく 'char' 0xFFD0を' String'に追加しています。 – AJNeufeld

+0

はい、 '(byte)x'としてキャストすると' Len:6 - 62 6c 61 2d 34 38'となり、0xffで 'and'することでunsignedに変換します。私は '3f'がどのようにそこに到達しているのか分からない。 –

+0

"0xD0&0xFF"は "0xD0"です。 "(バイト)(0xD0&0xFF)"は-48です。 – AJNeufeld

答えて

2

Javaが作成されると、彼らはバイナリデータbyte[], InputStream, OutputStream)とユニコードテキストString, char, Reader, Writer)。これは、byteが8ビットであり、charが16ビットであり、UTF-16を含むことを意味します。現在、UTF-16はUnicodeテキストをエンコードします。文字(「コードポイント」)は3バイトの範囲に番号が付けられます.2バイトの2文字が必要な場合もあります。あなたは任意の文字を使うことができません。暗黙または明示的な変換は常にコストがかかります。

可変バイト数を収集してbyte[]を取得するために使用できるByteArrayInputStreamおよびByteArrayOutputStreamを使用する方が効果的です。

まだ希望がある場合は、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 s = new String(utfByteArray, "UTF-8");

+0

ありがとう、私は基本的に 'D0'をバイト[]配列で' -48'ではなく取得しようとしていますが、基本的に 'D0'をシリアルポート経由でシングルバイトとして転送する必要があります。私はあなたが言ったように試みたが、まだ '3f'を得ている –

+0

私の答えを更新しました(私はあなたにこのサイトidkを知らせています) –

関連する問題