2011-12-25 10 views
1

私はzeromqを使って.netとjavaの両方を使用するプロジェクトに取り組んでいます。zeromq - bytearray(ネットサーバーから)javaの文字列

私は.netサーバーに接続できますが、バイト配列を文字列に変換しようとすると奇妙なことが起こります。 Eclipseのデバッガでは、文字列とその長さを見ることができます。文字列をクリックすると、値が最初の文字に変わり、長さが1に変わります。エクリプス・コンソールで出力をコピー&ペーストしようとすると、最初の文字しか表示されません。私もNetBeansで実行しようとして、同じ問題が発生しました。

私はそれが原因エンディアンになるかもしれないと思ったので、私だけの最初の文字の完全な文字列を取得し、ありませんどのように

疲れ両方 BIG_ENDIAN LITTLE_ENDIAN誰もが知っていますか?

import java.io.UnsupportedEncodingException; 
import java.nio.ByteBuffer; 
import java.nio.ByteOrder; 
import org.zeromq.ZMQ; 

class local_thr 
{ 
private static final String ENDPOINT = "tcp://127.0.0.1:8000"; 
static String[] myargs={ENDPOINT, "1000", "100"}; 
    public static void main (String [] args) { 

    args = myargs;  

    ZMQ.Context ctx = ZMQ.context (1); 
    ZMQ.Socket s = ctx.socket (ZMQ.SUB); 

    s.subscribe("".getBytes()); 
    s.connect (ENDPOINT); 

    while(true){ 
     byte [] data = s.recv (0); 


    ByteBuffer buf = ByteBuffer.wrap(data); 
     buf.order(ByteOrder.nativeOrder()); 

     byte[] bytes = new byte[buf.remaining()]; 
     buf.get(bytes, 0, bytes.length); 

      String quote; 
      quote = new String(bytes); 

      String myQuote; 
      myQuote = new String(); 
      System.out.println (quote); 
    } 
    } 
} 

答えて

2

1チャーデータがリトルエンディアンUTF-16としてエンコードされ、ヌル文字で終端として復号されていることを示唆している(シングルバイトを期待することができ、UTF-8を期待することができます)。

エンコーディングに精通しており、パイプの両端にと同じエンコーディングが使用されていることを確認してください。

java文字列(byte [])コンストラクタは、デフォルトのシステム文字セットを使用します。私はjavaからUTF-16を読み込む方法を調べることから始めます。または、両端からUTF-8を使用することもできます。デフォルトの文字セットを使用することは決して堅牢ではありません。

+0

返信いただきありがとうございます。私は古い試みを含めるべきでした。ここでは、UTF8(サーバーが送信している)と同じ結果が得られました。私もUTF16を試しましたが、中国の文字列がありました。 – Magick

+0

@Magickは同じで使ったのですか?どちらも?正直言って、私はサーバー間で同じ**バイト**をgettimgに焦点を当てます。純粋に各端のエンコーディングの問題です。 –

+0

もう一度おねがいします。Marc、あなたは正しい道に私を入れました。それはエンコーディングの問題でした。正しいエンコーディングはUTF-16LEだったことが分かります。 – Magick