2016-06-22 18 views
2

私は、文字列の下限として各バイトを処理するだけで、エンコーディングなしで文字列に変換する必要があるネットワーク接続を介してバイト配列を読み込みました。ハイエンドのゼロを残す。私はキャラクターの上端が常にゼロになることを知っているところで逆のことをする必要もあります。文字列をエンコーディングなしのバイト配列に変換する

ウェブを検索すると、元のデータソースを変更する必要があることを示す応答がすべて得られます。これはオプションではありませんので、提案してください。

これはC言語では些細なことですが、Javaでは非常に非効率的な変換ルーチンを書く必要があります。私が逃した簡単な方法はありますか?

+0

'new String(yourByteArray);'? – tkausl

+0

非常に効率が悪いと判断したのはどうでしたか? – Kayaman

+1

文字列に変換する理由あなたがバイト[]を持っているなら、あなたはそれをそのまま残すことができますか?エンコーディングがわからない場合は、これらのバイトをStringとして解釈する方法はありますか? –

答えて

0

Stringbyte arrayに変換し、符号化なしでStringに戻すサンプルコードを示します。

public class Test 
{ 

    public static void main(String[] args) 
    { 
     Test t = new Test(); 
     t.Test(); 
    } 

    public void Test() 
    { 
     String input = "Hèllo world"; 
     byte[] inputBytes = GetBytes(input); 
     String output = GetString(inputBytes); 
     System.out.println(output); 
    } 

    public byte[] GetBytes(String str) 
    { 
     char[] chars = str.toCharArray(); 
     byte[] bytes = new byte[chars.length * 2]; 
     for (int i = 0; i < chars.length; i++) 
     { 
      bytes[i * 2] = (byte) (chars[i] >> 8); 
      bytes[i * 2 + 1] = (byte) chars[i]; 
     } 

     return bytes; 
    } 

    public String GetString(byte[] bytes) 
    { 
     char[] chars = new char[bytes.length/2]; 
     char[] chars2 = new char[bytes.length/2]; 
     for (int i = 0; i < chars2.length; i++) 
      chars2[i] = (char) ((bytes[i * 2] << 8) + (bytes[i * 2 + 1] & 0xFF)); 

     return new String(chars2); 

    } 
} 
+0

提案していただきありがとうございます。私はこれに近いものを実装しており、すべてがうまく機能しているようです。 –

+0

それが役に立ったら答えを受け入れることができますか? – PVR

+0

これは1文字あたり2バイトを使用しますが... – tkausl

0

これは、上位8ビットを満たしながらバイト配列を文字列に変換します。

public static String stringFromBytes(byte byteData[]) { 
    char charData[] = new char[byteData.length]; 
    for(int i = 0; i < charData.length; i++) { 
     charData[i] = (char) (((int) byteData[i]) & 0xFF); 
    } 
    return new String(charData); 
} 

効率はかなり良いはずです。 Ben Thurley氏のように、パフォーマンスが本当に問題なのであれば、最初は文字列に変換せず、代わりにバイト配列で作業してください。

0

文字列はすでにUnicode/UTF-16としてエンコードされています。 UTF-16とは、表示可能な文字を1文字にするために、最大2文字の "文字"(char)を使用できることを意味します。あなたが本当にしたいことを使用することです:

byte[] bytes = System.Text.Encoding.Unicode.GetBytes(myString); 

バイトの配列に文字列を変換します。これはパフォーマンスが10倍速いことを除いて、あなたが上で行ったこととまったく同じです。あなたはほぼ半分に送信データをカットしたい場合、私は(ASCIIは、UTF8のサブセットである)UTF8に変換することをお勧めします - フォーマットは、インターネットは呼び出すことで、時間の90%を使用しています。

byte[] bytes = Encoding.UTF8.GetBytes(myString); 

文字列の使用に戻って変換するには:

String myString = Encoding.Unicode.GetString(bytes); 

または

+0

タグを気にしてください。このコードはC#/ .NET用ですが、質問には[java]というタグが付いています。しかし、同じ理論的根拠が適用され、ライブラリは似ています。スタックオーバーフローへようこそ。 –

0

いいえ、あなたは何も欠けていません。 Stringcharがテキストのため、簡単な方法はありません。あなたは明らかにあなたのデータをテキストとして扱いたくはありません。それがテキストでないなら完全に意味をなさないでしょう。あなたはそれをあなたが提案する難しい方法で行うことができます。

代わりに、任意のバイト値(0-255)の任意のシーケンスを許可する文字エンコードを想定します。 ISO-8859-1またはIBM437はどちらも資格があります。 (Windows-1252には251のコードポイントしかありません.UTF-8では任意のシーケンスが許可されていません)ISO-8859-1を使用すると、結果の文字列は難しい方法と同じになります。

効率性に関しては、バイト配列を処理する最も効率的な方法は、バイト配列として保持することです。

関連する問題