2012-04-27 6 views
1

RESTサービスでバイト配列を送信しています。これはStringとして受信されています。ここにその抜粋があります。開始タグと終了タグ。今パース文字列JavaMEのバイト配列の再表現

[0,0,0,0,32,122,26,65,0,0,0,0,96,123,26,65,0,0,0,0,192,123,20,65,0,0,0,0,0,125,20,65,71,73,70,56,57,97,244,1,244,1,247,0,0,51,85,51,51,85,102,51,85,153,51,85,204,51,85,255,51,128,0,51,128,51,51,128,102,51,128,153,51,128,204,51,128,255,51,170,0,51,170,51,51,170,102,51,170,153,51,170,204,51,170,255,51,213,0,51,213,51,51,213,102,51,213,153,51,213,204,51,213,255,51,255,0,51,255,51,51,255,102,51,255,153,51,255,204,51]

誰もが実際に作業をBase64デコーダを持っているブラックベリーを必要とするbase64でエンコードされた文字列として、それを送信する前に示唆。しかし、悲しいかな、それは64k以上のファイルで失敗し、Iveはalsortを試しました。

とにかくこれは、IVEが試したものです:

 str = str.replace('[', ' '); 
     str = str.replace(']', ' '); 
     String[] tokens = split(str,","); 
     byte[] decoded = new byte[tokens.length]; 
     for(int i = 0; i < tokens.length; i++) 
     {   
      decoded[i] = (byte)Integer.parseInt(tokens[i]);    
     } 

しかし、それは失敗します。分割がJAVAの実装のような場合found here.

論理的にはうまくいくはずですか?しかし、そうではありません。これはJavaME/Blackberryです。 Javaの回答は必要ありません(javaMEで動作しない限り)。

答えて

2

1つのマイナーな問題と1つは痛みです。 マイナー:空白(ニキータが言及した通り) メジャー:キャストするバイト数... javaは符号なしバイトしか持たないので、128バイト以上は整数からキャストするときに負数になります。

str = str.replace('[',' '); 
    str = str.replace(']', ' '); 
    String[] tokens = split(str,",");//String[] tokens = str.split(","); 
    byte[] decoded = new byte[tokens.length]; 
    for (int i = 0; i < tokens.length; i++) { 
     decoded[i] = (byte) (Integer.parseInt(tokens[i].trim()) & 0xFF); 
    } 
    for(byte b:decoded) { 
     int tmp = ((int)b) & 0xff; 
     System.out.print("byte:"+tmp); 
    } 

(ところで:実装するbase64でエンコーダ/デコーダは、特に難しいことではありません - しかし、あなたのプロジェクトのために、「やり過ぎ」であるかもしれない)私はバイト配列を送信するためにBase64でエンコードされた文字列を使用することをお勧めします

+0

ウェブ上でイメージを絶えず転送しているときに、それは過度なことではありません。 Iveはbase64デコーダのさまざまなインプリケーションを試みましたが、それはいつもうまく動作しませんでした。デコードエラーをスローします。 64kを超える静的メソッドは解析できません。また、読み込み可能なメソッドは、デコード可能であるべきものに対してランダムに失敗します(64k未満の静的メソッドで動作します)。しかし、符号なしバイトの観測をありがとう! – Doomsknight

+0

素晴らしい作品です。ありがとう。あなたが何をしたのかを説明するために(符号なしバイトの観点から)。スプリットコードに埋め込んでみるかもしれません。配列を二度通過するポイントはありません。 – Doomsknight

+1

あなたが使用しようとしたbase64実装を見て、結果をローカルバッファに保存する代わりに書き換えます(デバイスの最大64kは私の推測となります)。ストリームを使用します。 output - おそらく出力がファイルなどに行くことができますか?おそらく、ほとんどの実装で最初に行われたのではなく、4バイトブロックごとにパディングを処理する必要があります。ラファエルの答えのリンクにあるリンクのコードは、良い基盤のように見えます。 – esej

1

ないスペースで、空の文字列とブラケットを交換してください:あなたのケースで

str = str.replace('[', ''); 
str = str.replace(']', ''); 

を使用すると、配列次ています" 0"が整数に解析することはできません

[" 0", "0", "0", ..., "204", "51 "] 

最初の要素を。

+0

なぜ "0"は整数に解析できないのですか?なぜなら '''は無効な文字定数であるからです。私はそれが空間を解析すると仮定しました。 javaME atleastで '' ''を使うことはできません。しかし、問題をソートする前に.trim()を呼び出すことができます。 – Doomsknight

1

あります。a post with link to Base64 library for J2MEです。

この方法では、バイト配列を文字列に変換し、後でこの文字列をバイト配列に変換できます。

+0

ええ、私の質問では、私はこれを既に試したことを指摘しています。あなたが指定したリンクは、 'byte []'ではなく 'string'の' base64String'表現のためにのみ使用できます。 – Doomsknight