2011-12-25 32 views
1

我正在使用.net和java,使用zeromq在它們之間進行通信的項目。zeromq - bytearray(從.net服務器)到java中的字符串

我可以連接到.net服務器,但是當我嘗試將字節數組轉換爲字符串時會發生奇怪的事情。在eclipse調試器中,我可以看到字符串及其長度。當我點擊字符串時,它的值變成只有第一個字母,並且長度變爲1.在eclipse控制檯中,當我嘗試複製並粘貼輸出時,我只收到第一個字母。我也嘗試在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 2011-12-25 17:06:19

+0

@Magick你是否也在使用相同的。都?說實話,我將重點放在服務器之間的gettimg相同的**字節**上;那麼:這純粹是每一端的編碼問題。 – 2011-12-25 17:08:10

+0

再次感謝馬克,你讓我走在正確的道路上。這是一個編碼問題。原來正確的編碼是UTF-16LE。 – Magick 2011-12-25 17:37:11