C# zeromq-字节数组(从.net服务器)转换为java中的字符串

C# zeromq-字节数组(从.net服务器)转换为java中的字符串,c#,java,zeromq,C#,Java,Zeromq,我正在从事一个同时使用.net和java的项目,使用zeromq在它们之间进行通信 我可以连接到.net服务器,但是当我尝试将字节数组转换为字符串时,会发生奇怪的事情。在eclipse调试器中,我可以看到字符串及其长度。当我点击字符串时,它的值变为只有第一个字母,长度变为1。在eclipse控制台中,当我尝试复制和粘贴输出时,我只得到第一个字母。我还尝试在NetBeans中运行它,但也遇到了同样的问题 我想这可能是因为持久性,所以两者都累了 大田 小丁 有人知道我是如何得到完整的字符串,而不仅仅

我正在从事一个同时使用.net和java的项目,使用zeromq在它们之间进行通信

我可以连接到.net服务器,但是当我尝试将字节数组转换为字符串时,会发生奇怪的事情。在eclipse调试器中,我可以看到字符串及其长度。当我点击字符串时,它的值变为只有第一个字母,长度变为1。在eclipse控制台中,当我尝试复制和粘贴输出时,我只得到第一个字母。我还尝试在NetBeans中运行它,但也遇到了同样的问题

我想这可能是因为持久性,所以两者都累了 大田 小丁

有人知道我是如何得到完整的字符串,而不仅仅是第一个字母吗

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);
    }
  }
 }

1个字符表示数据编码为小端UTF-16,解码为nul终止(可能是单字节,可能是UTF-8)

确保您熟悉编码,并确保管道的两端使用相同的编码


java字符串(字节[])构造函数使用默认的系统字符集;我将从研究如何从java读取UTF-16开始。或者从两端使用UTF-8。使用默认字符集从来都不可靠。

谢谢您的回复。我应该包括我以前的尝试,在那里我指定了UTF8(服务器正在发送),但仍然得到了相同的结果。我也试过UTF16,但得到了一个看起来像中文的字符串。@Magick,你在家里用过同样的吗。二者都老实说,我的重点是在服务器之间获得相同的字节;然后:这纯粹是两端的编码问题。再次感谢马克,你让我走上了正确的道路。这是一个编码问题。原来正确的编码是UTF-16LE。@Magick这里没有一个“正确的”-只有两端使用相同的编码才是正确的;但如果你的意思是java需要将其读为UTF-16LE,因为这就是所编写的内容——那么事实上:这正是我(从症状)在回答的前几句话中推断的:pI使用UTF-8编码的JSON和MSGPACK格式来处理不同架构之间的序列化消息。使用明确的跨平台序列化是一种最佳实践,也是一个好主意。