事情是这样的
----------------------
因为程序需要,要用.net去接一个java的服务端来通讯通讯的原理,就是按一定的规则,把 string -> byte[] 传过去----------------------遇到问题如下:
(utf-8编码)我把 "Hello" 搞成byte[] 传过去,对方能判别,英文没问题我把 "关"  搞成byte[] 传过去,对方【不能识别】,,中文出问题了我们双方对了一下 byte[] 里的 每个byte发现-----------------------------------
【NET】
"Hello"  {104,101,108,108,111}
"关"     {229,133,179}
-----------------------------------
【java】
"Hello"  {104,101,108,108,111}
"关"     {-27,-123,-77}
-----------------------------------
查了下资料,,
------------------
c#中字节byte的范围是0~255;
java中字节byte的范围是-128~127:
------------------OH,,My god。。如何是好,,
我这边.net 一定要按 java 那种byte[] 过去的,否则接不了,有招吗?大侠们附代码(net)
------------------------
string str = "关";
byte[] BB = Encoding.GetEncoding("utf-8").GetBytes(str);
------------------------

解决方案 »

  1.   

    .net 用有符号的 byte 
      

  2.   

    我测试了一下,貌似啥毛病都没有啊
    JDK7,VS2010(中文),Win7(x86)(中文)
    下面是测试代码啊
    public static void main(String[] args) throws IOException  {
    // TODO Auto-generated method stub
    ServerSocket server=new ServerSocket(5678);
            
             Socket client=server.accept();
             byte[] b="关".getBytes("utf8");
             client.getOutputStream().write(b);
            
    //         byte[] b="Hello".getBytes("utf8");
    //         client.getOutputStream().write(b);
            
             client.close();
            
            
    }        static void Main(string[] args)
            {
                System.Net.Sockets.TcpClient client = new System.Net.Sockets.TcpClient("localhost", 5678);
                byte[] b = new byte[1024];
                int i = client.GetStream().Read(b, 0, b.Length);
                string s = System.Text.Encoding.UTF8.GetString(b, 0, i);            client.Close();
            }虽然java和C#中byte范围不同的,但是对于Java中的负值,C#自动加上256变成自己的数据范围。
    这个直接可以在C#中进行测试,代码如下        static void Main(string[] args)
            {
                int i = -27;
                byte testbyte = (byte)i;
            }testbyte的值为229。
      

  3.   

    另一个办法就是,楼主每次发送的内容如果不多的话,就先将内容进行base64编码,然后再发送,这样就等于全发送的ascii字符了,到C#这边再解码一下就OK了